Create 198houserobber.md#35
Conversation
|
|
||
| @cache | ||
| def get_max_money(self, nums: Tuple[int], index: int=-1) -> int: | ||
| if not nums: |
There was a problem hiding this comment.
get_max_money関数の中でnumsの長さが変わることはないのでこのチェックはrob関数の中で行ってもよいと思いました。
There was a problem hiding this comment.
確かにありですね。
今回は別の関数に切り出したので、単体でも動くように値チェックをこちらでしてみました。
|
|
||
| 他で呼び出されても大丈夫なように値のチェックを多めに書いてみた。 | ||
|
|
||
| indexは負でアクセスされても良いように、最大値を超えても良いようにしてみた。 |
There was a problem hiding this comment.
負でアクセスできるようにするメリットがよくわからなかったのですが、どのようなケースを想定されていますか?
return self.get_max_money(tuple(nums), len(nums)-1) とすればインデックスを常に非負にすることができます。
There was a problem hiding this comment.
レビューありがとうございます。
この問題を解く上では必要ないのですが、
nums[-1]って書くように、indexを負で書いても動いたら便利かなと思って書きました。
There was a problem hiding this comment.
ん、nums[-1]は、意図せず末尾にアクセスしてしまうのでむしろアクセスできない方が良いのではと思ったのですが、どうなんでしょう...?(変なこと言ってたらすみません)
There was a problem hiding this comment.
すみません、言葉足らずでした。
この関数はnumsの0~indexの最大値を求める関数です。
配列で末尾にアクセスする方法としてnums[-1]と書くのと同様に、マイナスを使うことによって、末尾からindexを指定できても良いかもという気持ちで書きました。
なくてもよい機能ですし、再帰でやっているので負になるのは好ましくないかもなあという気持ちにもなりました。
| return get_max_count(len(nums)-1) | ||
| ``` | ||
|
|
||
| これ、二回robがあったら壊れる? |
There was a problem hiding this comment.
https://docs.python.org/3/library/functools.html#functools.lru_cache
cache_clear というのがありますね。
| def rob(self, nums: List[int]) -> int: | ||
| return self.get_max_money(tuple(nums)) | ||
|
|
||
| @cache |
There was a problem hiding this comment.
メンバー関数としての cache だとインスタンスごとに過去の計算結果をすべて覚えていることになるかと思います。
同じインスタンスを再利用すると、だんだんメモリー使用量が増えていくのは好ましくないのではないでしょうか。
There was a problem hiding this comment.
レビューありがとうございます。
再利用した際のメモリ使用量は考慮できていませんでした。
関数内関数に置くか、maxsizeを指定するのが良いでしょうか。
| candidate = get_max_count(index-2) + nums[index] | ||
| return max(candidate, get_max_count(index-1)) |
There was a problem hiding this comment.
個人的な感覚ですが、インデックスがiならi-1と詰めて書いてしまうのでもいいと感じますが、index-1とかって、どこに区切りがあるのかがぱっと見でよくわからないのでindex - 1にしたいかも、という気持ちになる気がします。
| if num_houses == 1: # ここ忘れてWA | ||
| return nums[0] | ||
| max_money = [0] * num_houses | ||
| max_money[0] = nums[0] |
There was a problem hiding this comment.
max_money[0]を0にして、max_money[1]をnums[0]にすれば、L27~28の場合分けが必要なくなりますね。
| return nums[0] | ||
| if index == 1: | ||
| return max(nums[0], nums[1]) | ||
| candidate = get_max_count(index-2) + nums[index] |
There was a problem hiding this comment.
個人的には、これくらいならわざわざcandidateという変数におかずmaxの中に直接式を書いちゃいますかね(細かい好みですが)
https://leetcode.com/problems/house-robber/description/