Conversation
| if (maxSubarraySumsByTail.isEmpty) { | ||
| maxSubarraySumsByTail.add(nums[tail]); | ||
| continue; | ||
| } |
There was a problem hiding this comment.
関数のはじめにnullチェックをしているので,maxSubarraySumsByTailを作った直後にnums[0]をaddする方が好みです.
forループごとにif文判定が入るが,最初のループのみTrueでadd(nums[0])が行われ,残りは全てfalseなので,ならループごとに判定せず最初からnums[0]だけ追加してしまえば良いのでは,という程度の気持ちです.
| total: nums[start], | ||
| maxFromStart: nums[start], | ||
| maxToEnd: nums[start], | ||
| subArrayMax: nums[start], |
There was a problem hiding this comment.
個人的にはなんのtotalなのか,なんのmaxなのかを示すために,
totalSum: nums[start],
maxSumFromStart: nums[start],
maxSumToEnd: nums[start],
subArraySumMax: nums[start],とするとわかりやすいと感じました.
totalが最初何を指しているのかわからず,論理を追って初めて分かったので,totalだけSumをつけても良いかもしれませんが,統一したほうが好みです.
There was a problem hiding this comment.
レビューありがとうございます!
確かに totalSum の方が意味が明確になりますね。参考にさせていただきます🙇
|
|
||
| // 分割統治法 | ||
| class Solution { | ||
| int maxSubArray(List<int> nums) { |
There was a problem hiding this comment.
分割統治はややこしかった記憶があるのですが,こちらのコードは(特に中心を跨ぐ部分列の処理が)だいぶ読みやすかったです.
|
全体的に読みやすかったです. |
| final maxSubarraySumCandidate = prefixSumToNum - minPrefixSum; | ||
|
|
||
| maxSubarraySum = max(maxSubarraySum, maxSubarraySumCandidate); |
There was a problem hiding this comment.
ここは一度変数に置くよりも、直接比較したほうが自然言語での説明に近い気がしました。
| final maxSubarraySumCandidate = prefixSumToNum - minPrefixSum; | |
| maxSubarraySum = max(maxSubarraySum, maxSubarraySumCandidate); | |
| maxSubarraySum = max(maxSubarraySum, prefixSumToNum - minPrefixSum); |
|
|
||
| final priorSubarraySum = maxSubarraySumsByTail[tail - 1]; | ||
| final subarraySum = max(nums[tail], priorSubarraySum + nums[tail]); | ||
| maxSubarraySumsByTail.add(subarraySum); |
There was a problem hiding this comment.
はじめに決まった長さの配列長を取ったほうが、添字との対応が分かりやすくなりそうに見えました。
解いた問題:https://leetcode.com/problems/maximum-subarray/description/
次に解く問題:https://leetcode.com/problems/unique-paths/description/