Conversation
| if (nums.isEmpty) { | ||
| return 0; | ||
| } | ||
| if (nums.length == 1) { |
There was a problem hiding this comment.
ご承知の上かもしれませんが一応、nums.length == 1の例外処理はその後のロジックに内包されているのでなくても問題ないですね。
可読性の観点では個人的にはどちらでも大差ないと思います。
| // > Since House[1] and House[n] are adjacent, they cannot be robbed together. | ||
| // > Therefore, the problem becomes to rob either House[1]-House[n-1] or House[2]-House[n], depending on which choice offers more money. | ||
| // らしい。 | ||
| // 言われればそうだが、どうやって思いつくかの思考回路が知りたかったので、Claude に聞いてみた。 |
There was a problem hiding this comment.
私もLeetCodeのヒントを見て「ああ〜」となりました。こういうのを思いつける思考フレームワークが足りてないので参考になりました。
There was a problem hiding this comment.
ちょっととんち扱いになっているのよくないと思うので、私の考え方を書きますね。
極端な話、まず、2^n 通り列挙して、そこから条件を満たしているものだけ取り出して、それぞれ和を取って最大値を取ればいけますよね。この 2^n 枚の紙をバインダーに挟んで、このパターンで盗んだときに、いくらになるかを計算し、最大にならない紙を捨てて、一番大きい紙を見つける方法でやってみましょう。
各家の前に、泥棒が立って、バインダーが回ってきます。2^n 枚の紙の自分の担当の情報を埋めていくわけです。
泥棒文句言うと思うんですね。ほとんどの紙は条件を満たしていません。先に捨てておけよ。
あと、最大になりようがないのも回ってきますね。自分は10人目なのにまだ1件も入っていない。先に捨てておけよ。
え、でも全部捨てたら怒られますよね。じゃあ、何は捨てたらだめですか。
これすると同じようなことが書かれている紙だけが残ります。
これ、1件目の家で盗んだか盗んでいないか、一つ前の家で盗んだか盗んでいないか、それぞれの最大の4種類だけですね。
There was a problem hiding this comment.
え、でも全部捨てたら怒られますよね。じゃあ、何は捨てたらだめですか。
これすると同じようなことが書かれている紙だけが残ります。
これ、1件目の家で盗んだか盗んでいないか、一つ前の家で盗んだか盗んでいないか、それぞれの最大の4種類だけですね。
自力で解法を思いつかなかった身としては、この行間にまだ飛躍があるように感じました。
「一つ前の家で盗んだか盗んでいないか」は、自分が i 軒目の家の前にいる泥棒になったとき、自分の担当として埋めるか、埋めずに隣へ回すか、という感じで想像できました。
「1軒目の家で盗んだか盗んでいないか」は、最後の家の前にいる泥棒になったとき、1軒目で盗んでいるなら自分は盗めないな=自分の担当の金額は埋められないな、と思うだろう、という感じでしょうか。
| final maxGainWithoutFirst = robLine(nums.sublist(1)); | ||
| final maxGainWithoutLast = robLine(nums.sublist(0, nums.length - 1)); |
There was a problem hiding this comment.
コードとしては冗長なのですが、以下のように書くと「ひとづずらし」感が出るかなあと思いました。
| final maxGainWithoutFirst = robLine(nums.sublist(1)); | |
| final maxGainWithoutLast = robLine(nums.sublist(0, nums.length - 1)); | |
| final maxGainWithoutFirst = robLine(nums.sublist(1, nums.length)); | |
| final maxGainWithoutLast = robLine(nums.sublist(0, nums.length - 1)); |
解いた問題:213. House Robber II
次に解く問題:121. Best Time to Buy and Sell Stock