diff --git a/198_house_robber/problem.md b/198_house_robber/problem.md new file mode 100644 index 0000000..5eafa28 --- /dev/null +++ b/198_house_robber/problem.md @@ -0,0 +1 @@ +## 問題: [198. House Robber](https://leetcode.com/problems/house-robber/description/) diff --git a/198_house_robber/step1.md b/198_house_robber/step1.md new file mode 100644 index 0000000..171ed86 --- /dev/null +++ b/198_house_robber/step1.md @@ -0,0 +1,25 @@ +# Step 1 + +- $house(n)$まで訪れた時の最大の額$maxAmount(n)$は、$max(house(n) + maxAmount(n-2), maxAmount(n-1))$である + +```python +class Solution: + def rob(self, nums: List[int]) -> int: + # 問題の制約でnumsのサイズが1以上は保証されているので、0は考慮しない + if len(nums) == 1: + return nums[0] + if len(nums) == 2: + return max(nums[0], nums[1]) + max_amount_prev_2 = nums[0] + max_amount_prev_1 = max(nums[0], nums[1]) + for i in range(2, len(nums)): + max_amount = max(max_amount_prev_1, nums[i] + max_amount_prev_2) + max_amount_prev_2 = max_amount_prev_1 + max_amount_prev_1 = max_amount + return max_amount_prev_1 + +``` + +時間計算量: $O(n)$ + +空間計算量: $O(1)$ diff --git a/198_house_robber/step2.md b/198_house_robber/step2.md new file mode 100644 index 0000000..6992b2c --- /dev/null +++ b/198_house_robber/step2.md @@ -0,0 +1,23 @@ +# Step 2 + +```python +class Solution: + def rob(self, nums: List[int]) -> int: + # 問題の制約でnumsのサイズが1以上は保証されているので、0は考慮しない + if len(nums) == 1: + return nums[0] + if len(nums) == 2: + return max(nums[0], nums[1]) + max_amount_prev_2 = nums[0] + max_amount_prev_1 = max(nums[0], nums[1]) + for i in range(2, len(nums)): + max_amount = max(max_amount_prev_1, nums[i] + max_amount_prev_2) + max_amount_prev_2 = max_amount_prev_1 + max_amount_prev_1 = max_amount + return max_amount_prev_1 + +``` + +時間計算量: $O(n)$ + +空間計算量: $O(1)$ \ No newline at end of file diff --git a/198_house_robber/step3.md b/198_house_robber/step3.md new file mode 100644 index 0000000..90ce252 --- /dev/null +++ b/198_house_robber/step3.md @@ -0,0 +1,24 @@ +# Step 3 + +```python +class Solution: + def rob(self, nums: List[int]) -> int: + if len(nums) == 1: + return nums[0] + if len(nums) == 2: + return max(nums[0], nums[1]) + max_amount_prev_2 = nums[0] + max_amount_prev_1 = max(nums[0], nums[1]) + + for i in range(2, len(nums)): + max_amount = max(max_amount_prev_1, nums[i] + max_amount_prev_2) + max_amount_prev_2 = max_amount_prev_1 + max_amount_prev_1 = max_amount + return max_amount_prev_1 +``` + +1回目: 1分 46秒 + +2回目: 1分 58秒 + +3回目: 1分 47秒