Skip to content

53. Maximum Subarray#30

Open
seal-azarashi wants to merge 8 commits intomainfrom
maximum-subarray
Open

53. Maximum Subarray#30
seal-azarashi wants to merge 8 commits intomainfrom
maximum-subarray

Conversation

@seal-azarashi
Copy link
Owner

Comment on lines +196 to +201
int rightSum = Integer.MIN_VALUE;
int currentRightSum = 0;
for (int i = mid + 1; i <= right; i++) {
currentRightSum += nums[i];
rightSum = Math.max(rightSum, currentRightSum);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mid == rightだとrightSumがInteger.MIN_VALUEになるなと思いましたが、rightが必ずmidより大きくなるようにmidを計算しているから上手くいくんですね。関数の頭に assert mid < right; みたいにアサーションを書いても良いのかもしれないなと思いました。

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確かに、閉区間でやっていて、maxSubArrayHelper は長さが1のときには early return しているので、左も右も大きさが1以上はある、というのを示さないとこのプログラムがきちんと動くことが分からないですね。

できるだけそういうことは読み手に証明させないように書きたいですね。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fhiyo @oda
大変返信が遅くなりました。

仰るとおり読み手が上記のようなことを証明しなければならないのは好ましくないので、次のようなチェックを加えました: c8aa40e
尚、Java の assert はプロダクション環境で使うの好ましくないとされている (exception の種類が一種に固定されるし、そもそもデフォルトでオフにされている) ので unchecked exception を使用しています。

もし上記では充分でない、やり過ぎであるといったことがあればご指摘頂けますと嬉しいです🙏

class Solution {
public int maxSubArray(int[] nums) {
int maxSubArray = nums[0];
int sumInWindow = 0;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sliding Windowのwindowでしょうか?
自分がSliding Windowをよく理解していないからというのもございますが、何のsumなのかわかる変数名がいいかなと感じました。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Ryotaro25
すいません、返信大変遅くなりました。
はい、sliding window の window の意味でこの命名にしていました。しかしご存じない方が見ると意味が分かりづらいのはその通りだと思います。下の解法にあるような currentSum とかだと良いでしょうか?もっと良い案があったら教えていただけると嬉しいです🙏

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Window 単体でも A restricted range. という意味ですね。
https://en.wiktionary.org/wiki/window#Noun
ただ、それを認めたうえで、これ、日本語だと思うと、びっくりすると思うんですよ。

maxSubArray は、「部分配列の最大」ということですが、部分配列の和が最大なのは気合で読めたとしましょう。
次に、「限定された範囲の中の合計」が出てきて、限定された範囲というのはどこだ、となるでしょう。
そうすると、開始点と終了点を探すパズルが発生して、= 0 を代入した瞬間と、ループの num を足した瞬間であることが分かるのですが、このことについてのヒントが欲しいですね。

この変数が入っているのは「num を使う場合の部分配列の合計の最大」ですね。
で、これが分かると、ようやく帰納法を使って、「num の前までを使う場合の部分配列の合計の最大」が分かっているとして、「num を使う場合の部分配列の合計の最大」を計算するにはどうしたらいいのかを考えていると分かります。

GPT に聞いたところ、subArraySumSoFar, maxEndingHere, localMaxSubArraySum あたりをサジェストしてきました。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

次に、「限定された範囲の中の合計」が出てきて、限定された範囲というのはどこだ、となるでしょう。
そうすると、開始点と終了点を探すパズルが発生して、= 0 を代入した瞬間と、ループの num を足した瞬間であることが分かるのですが、このことについてのヒントが欲しいですね。

この変数が入っているのは「num を使う場合の部分配列の合計の最大」ですね。
で、これが分かると、ようやく帰納法を使って、「num の前までを使う場合の部分配列の合計の最大」が分かっているとして、「num を使う場合の部分配列の合計の最大」を計算するにはどうしたらいいのかを考えていると分かります。

いやー仰るとおりですね。

GPT に聞いたところ、subArraySumSoFar, maxEndingHere, localMaxSubArraySum あたりをサジェストしてきました。

ありがとうございます。
どれも良いですが、subArraySumSoFar は特に納得感があります。認識に個人差はあると思いますが、so far と書いてあると「(開始点から) 現時点までの」というニュアンスを含まれる気がするので。
上記採用して Step 4 に記載しました。


### Cubic な解法

タイムアウトするようなコードも書けるようになっておけばそこからより良い解法を考えられるようになる、とどこかで oda さんが仰ってたのを思い出して書いてみました。予想通り TLE。

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

面白いですね。
”タイムアウトするようなコードも書けるようになる” → ”良い解法を考えられる” 
こうなるために、意識することなどございますか?どこをさわればTLEになるのか把握するなどですかね。

Copy link
Owner Author

@seal-azarashi seal-azarashi Oct 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Ryotaro25
こちらも大変返信遅くなりました。

個人的には、ひとまず手を動かすのが大事なのかなと考えています。頭の中をテキストエディタなりノートに書き出せば脳内メモリの節約 (というか拡張?) が出来て理解が進みますし、Leetcode のような判定ロジックを提供してくれるサービスに submit すれば実装の確認も出来るので、そういった作業をしていくと良い解法に近づいていけるのかなと思います。手を動かさずにただただ考え続けるよりもずっと効率が良く感じます。

@seal-azarashi seal-azarashi mentioned this pull request Oct 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants