Conversation
| int twoPreviousMaximumRobbedMoney = nums[0]; | ||
| int previousMaximumRobbedMoney = max(nums[0], nums[1]); |
There was a problem hiding this comment.
こちらは2つの状態、A:「最後に盗んだのが2つ以上前の家であるとき
」, B:「1つ以上前の家であるとき」に分けて考えたと思いますが、A ⊃ Bなので、以下のように分けると排反になって良いかなと思いました。
- 1つ前の家をスキップしたとき = last_skipped
- 1つ前の家に盗みに入ったとき = last_robbed
具体的な解法は過去のコメントにあったと思います。
There was a problem hiding this comment.
こちらなどにありますね.
一方で私は必ずしも排反にする必要性もないかな,と感じました.というのも今回は排反にすることで嬉しいことが起こるケースもありますが,今回は特に嬉しさは感じなかったためです.
むしろ,「一つ前を盗んでいる可能性があるかどうか」で場合分けする方が,条件から素直に出てくる考えでわかりやすいと感じます.
この辺は感性の問題だと思いますので,単なる一意見として参考にしてください.
| if (nums.size() == 1) { | ||
| return nums[0]; | ||
| } |
There was a problem hiding this comment.
nums.size() == 1のみを例外処理している点に違和感を覚えました.
というのもnums.size() == 1でもこの行以降のコードは正しく動くからです.コーナーケースとして明示的に扱うなら,(問題の制約上あり得ないですが)nums.size() == 0(つまりnums.empty() == True)も考慮したコードの方が,実用的に感じました.
| } | ||
| maximumBenefit[0] = nums[0]; | ||
| for (int i = 1; i < nums.size(); ++i) { | ||
| int benefit = nums[i]; |
There was a problem hiding this comment.
benefitは単なる利益でなくnums[i]から奪った時の最大利益なので,やや説明的すぎる気もしますが,
benefit_with_ith_housebenefit_robbing_ith_housebenefit_robbing_last_house
などはいかがでしょうか.
(もっとも,この規模のコードならbenefitでも十分に意図は伝わると思います.)
| int twoPreviousMaximumRobbedMoney = nums[0]; | ||
| int previousMaximumRobbedMoney = max(nums[0], nums[1]); |
There was a problem hiding this comment.
こちらなどにありますね.
一方で私は必ずしも排反にする必要性もないかな,と感じました.というのも今回は排反にすることで嬉しいことが起こるケースもありますが,今回は特に嬉しさは感じなかったためです.
むしろ,「一つ前を盗んでいる可能性があるかどうか」で場合分けする方が,条件から素直に出てくる考えでわかりやすいと感じます.
この辺は感性の問題だと思いますので,単なる一意見として参考にしてください.
| if (nums.size() == 1) { | ||
| return nums.front(); | ||
| } | ||
| int twoPreviousMaximumRobbedMoney = nums[0]; |
There was a problem hiding this comment.
Maximum という単語は、しばしば Max と略されるのを目にします。 Minimum も Min と略されるように思います。
https://leetcode.com/problems/house-robber/