こんにちは
今回の学びは
・ソートすることで、物事を一方方向に見るだけでよくすることで、+1, -1の制約を一個外している。
(時間配分は5分問題理解=restate&clarify 10分検討multip-sol, analysis, reasons 10分実装 20分振り返り の一文45分構成)をできればgoogle docで笑&真剣。
終始、わからないことは声にだして、明確にしていきましょう。
1,まずは入出力をしっかりおさえましょう。(問題を自分の言葉で復唱すること、わからないことをクリアにすると、前提も声にだすこと)
2,いくつかのソリューションを声にだして出してみましょう。(もちろんtime complexit, space complexityの分析や理由を付け加えて)
3,どれでいくか、一緒に決定しましょう。(理由付きでね、よろしく)
timespace analysis (時間とスペースの分析)は 〇〇です
# duplicated, not sorted. 1 <= x <= 10000 and N <= 20000 # constrain: remove S[i]+1, S[i]-1 # [3, 4, 2] # {3:3 -> 9 # 4:1 -> 4 # 2:2 -> 4 # } f(N-1) = max(points) f(2) = f(0) + f(4) + 4 f(i) = f(S[i]-2) + f(S[i]+2) + S[i]
4、実装しましょう。
時間オーバーなので回答をみた。その上で、もうしこしだとおもった。
もみたけど、方向はよくて、ヒントをみて自力でclearした。
特に、バグがちゃんとみつけれてよかった。この回答を眺めたのが直接のヒントとなった
バグはここにあった!dp[i-1]もわすれてはいけない!
class Solution: def deleteAndEarn(self, nums: List[int]) -> int: def f(x): # return maximum point at 1 pass memo = defaultdict(int) for x in nums: memo[x] += 1 memo = { k: k*v for k, v in memo.items() } print(memo) N = 10001 maxi = 0 # number of values limited to 1 to 10000 dp = [0] * N for i in range(N): if i - 2 >= 0: #dp[i] = dp[i-2] + memo.get(i, 0) # バグはここにあった!dp[i-1]もわすれてはいけない! dp[i] = max(dp[i-2] + memo.get(i, 0), dp[i-1]) else: dp[i] = memo.get(i, 0) maxi = max(maxi, dp[i]) return maxi
5、エッジケースとサンプルテストを忘れずに!
振り返り
「次のこの問題を解くばあい知っていればよい一つの事実とは?」
ソートすることで、物事を一方方向に見るだけでよくすることで、+1, -1の制約を一個外している。
まとめ
・ソートすることで、物事を一方方向に見るだけでよくすることで、+1, -1の制約を一個外している。
以上です