Skip to content

213. House Robber II#35

Open
TakayaShirai wants to merge 1 commit intomainfrom
213_house_robber_II
Open

213. House Robber II#35
TakayaShirai wants to merge 1 commit intomainfrom
213_house_robber_II

Conversation

@TakayaShirai
Copy link
Owner

解いた問題:213. House Robber II
次に解く問題:121. Best Time to Buy and Sell Stock

@TakayaShirai TakayaShirai self-assigned this Mar 5, 2026
Copy link

@5ky7 5ky7 left a comment

Choose a reason for hiding this comment

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

読みやすいです。

if (nums.isEmpty) {
return 0;
}
if (nums.length == 1) {
Copy link

Choose a reason for hiding this comment

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

ご承知の上かもしれませんが一応、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 に聞いてみた。
Copy link

Choose a reason for hiding this comment

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

私もLeetCodeのヒントを見て「ああ〜」となりました。こういうのを思いつける思考フレームワークが足りてないので参考になりました。

Copy link

Choose a reason for hiding this comment

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

ちょっととんち扱いになっているのよくないと思うので、私の考え方を書きますね。

極端な話、まず、2^n 通り列挙して、そこから条件を満たしているものだけ取り出して、それぞれ和を取って最大値を取ればいけますよね。この 2^n 枚の紙をバインダーに挟んで、このパターンで盗んだときに、いくらになるかを計算し、最大にならない紙を捨てて、一番大きい紙を見つける方法でやってみましょう。

各家の前に、泥棒が立って、バインダーが回ってきます。2^n 枚の紙の自分の担当の情報を埋めていくわけです。

泥棒文句言うと思うんですね。ほとんどの紙は条件を満たしていません。先に捨てておけよ。
あと、最大になりようがないのも回ってきますね。自分は10人目なのにまだ1件も入っていない。先に捨てておけよ。

え、でも全部捨てたら怒られますよね。じゃあ、何は捨てたらだめですか。

これすると同じようなことが書かれている紙だけが残ります。
これ、1件目の家で盗んだか盗んでいないか、一つ前の家で盗んだか盗んでいないか、それぞれの最大の4種類だけですね。

Copy link

Choose a reason for hiding this comment

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

s/件/軒/g

Copy link

Choose a reason for hiding this comment

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

@oda

え、でも全部捨てたら怒られますよね。じゃあ、何は捨てたらだめですか。

これすると同じようなことが書かれている紙だけが残ります。
これ、1件目の家で盗んだか盗んでいないか、一つ前の家で盗んだか盗んでいないか、それぞれの最大の4種類だけですね。

自力で解法を思いつかなかった身としては、この行間にまだ飛躍があるように感じました。
「一つ前の家で盗んだか盗んでいないか」は、自分が i 軒目の家の前にいる泥棒になったとき、自分の担当として埋めるか、埋めずに隣へ回すか、という感じで想像できました。
「1軒目の家で盗んだか盗んでいないか」は、最後の家の前にいる泥棒になったとき、1軒目で盗んでいるなら自分は盗めないな=自分の担当の金額は埋められないな、と思うだろう、という感じでしょうか。

Copy link

Choose a reason for hiding this comment

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

そうですね。最後まで考えるとそうなります。

Comment on lines +53 to +54
final maxGainWithoutFirst = robLine(nums.sublist(1));
final maxGainWithoutLast = robLine(nums.sublist(0, nums.length - 1));
Copy link

Choose a reason for hiding this comment

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

コードとしては冗長なのですが、以下のように書くと「ひとづずらし」感が出るかなあと思いました。

Suggested change
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));

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