Conversation
|
|
||
| ## 他の解法 | ||
|
|
||
| Follow upでdivide and conquerが仄めかされていたので、どうにか問題を分割できないか考えていたのだが、思いつかなかった。 |
There was a problem hiding this comment.
役に立つかはわかりませんが、以下自分の理解です。
与えられた配列を中央で分けて、左の部分配列と右の部分配列でそれぞれ最大の和を再帰的に探していきます。が、中央を跨ぐ部分配列も最大の和が作れる候補になり得るので、
- 分割
- 配列を中央で分ける
- 統治
- 左半分の最大和を再帰的に求める
- 右半分の最大和を再帰的に求める
- 中央を跨ぐ最大和を求める(配列の左端と右端を広げる方向に動かし、和が最大になる部分を見つける)
- 結合
- i.~iii.で最も大きいものを最大和とする
のような関数を用意して実装する必要があります。
There was a problem hiding this comment.
丁寧にありがとうございます!まだ中央を跨ぐ最大和の扱いがしっくり頭に収まらないのですが、もう少し考えてみます...
| def maxSubArray(self, nums: list[int]) -> int: | ||
| cumulative_sum = 0 | ||
| min_cumulative_sum_so_far = 0 | ||
| max_subarray_sum = -float("inf") |
There was a problem hiding this comment.
max_subarray_sum は int なので、float("inf") ではなく sys.maxsize を選ぶ考え方もあるようです。
An integer giving the maximum value a variable of type Py_ssize_t can take
https://docs.python.org/3/library/sys.html#sys.maxsize
There was a problem hiding this comment.
コメントありがとうございます!私は、sys.maxsizeはプラットフォーム依存・Pythonのintには上限がなくsys.maxsizeを超えうる、といった問題がある一方、PythonではDuck-Typingが推奨されているような気がするので、floatとintのミスマッチは大きな問題ではないと考えています。また、sys.maxsizeはlistなどの最大データ長を表し、それをとりうる最大の値として用いるのは、少しミスリーディングかな?とも思っています。が、実際他の方々がどう思うかはわかりません...
| for num in nums: | ||
| max_ending_subarray_sum = max(max_ending_subarray_sum + num, num) | ||
| max_subarray_sum = max(max_subarray_sum, max_ending_subarray_sum) | ||
| return max_subarray_sum |
https://leetcode.com/problems/maximum-subarray/description/