Skip to content

Commit 0f4ec70

Browse files
authored
Merge pull request #1609 from ivanpenaloza/april16
adding uptes
2 parents b569499 + d5657ab commit 0f4ec70

3 files changed

Lines changed: 100 additions & 0 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def rob(self, nums: List[int]) -> int:
6+
"""
7+
Dynamic Programming approach:
8+
- For each house, we choose max of:
9+
1. Rob current house + max money from i-2 houses
10+
2. Skip current house and take max money from i-1 houses
11+
12+
Time: O(n), Space: O(1)
13+
"""
14+
if not nums:
15+
return 0
16+
if len(nums) == 1:
17+
return nums[0]
18+
19+
# prev2: max money robbed up to i-2
20+
# prev1: max money robbed up to i-1
21+
prev2 = nums[0]
22+
prev1 = max(nums[0], nums[1])
23+
24+
for i in range(2, len(nums)):
25+
current = max(nums[i] + prev2, prev1)
26+
prev2 = prev1
27+
prev1 = current
28+
29+
return prev1
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
function rob(nums: number[]): number {
2+
/**
3+
* Dynamic Programming approach:
4+
* - For each house, we choose max of:
5+
* 1. Rob current house + max money from i-2 houses
6+
* 2. Skip current house and take max money from i-1 houses
7+
*
8+
* Time: O(n), Space: O(1)
9+
*/
10+
if (nums.length === 0) return 0;
11+
if (nums.length === 1) return nums[0];
12+
13+
// prev2: max money robbed up to i-2
14+
// prev1: max money robbed up to i-1
15+
let prev2 = nums[0];
16+
let prev1 = Math.max(nums[0], nums[1]);
17+
18+
for (let i = 2; i < nums.length; i++) {
19+
const current = Math.max(nums[i] + prev2, prev1);
20+
prev2 = prev1;
21+
prev1 = current;
22+
}
23+
24+
return prev1;
25+
}
26+
27+
// Example usage:
28+
// console.log(rob([1, 2, 3, 1])); // Output: 4
29+
// console.log(rob([2, 7, 9, 3, 1])); // Output: 12
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import unittest
2+
from src.my_project.interviews.top_150_questions_round_22\
3+
.ex_133_house_robber import Solution
4+
5+
6+
class HouseRobberTestCase(unittest.TestCase):
7+
def setUp(self):
8+
self.solution = Solution()
9+
10+
def test_example_1(self):
11+
"""Test case: [1,2,3,1] -> 4"""
12+
nums = [1, 2, 3, 1]
13+
self.assertEqual(self.solution.rob(nums), 4)
14+
15+
def test_example_2(self):
16+
"""Test case: [2,7,9,3,1] -> 12"""
17+
nums = [2, 7, 9, 3, 1]
18+
self.assertEqual(self.solution.rob(nums), 12)
19+
20+
def test_single_house(self):
21+
"""Test case: Single house"""
22+
nums = [5]
23+
self.assertEqual(self.solution.rob(nums), 5)
24+
25+
def test_two_houses(self):
26+
"""Test case: Two houses"""
27+
nums = [1, 2]
28+
self.assertEqual(self.solution.rob(nums), 2)
29+
30+
def test_all_same_value(self):
31+
"""Test case: All houses have same value"""
32+
nums = [5, 5, 5, 5, 5]
33+
self.assertEqual(self.solution.rob(nums), 15)
34+
35+
def test_ascending_values(self):
36+
"""Test case: Ascending values"""
37+
nums = [1, 2, 3, 4, 5]
38+
self.assertEqual(self.solution.rob(nums), 9)
39+
40+
41+
if __name__ == '__main__':
42+
unittest.main()

0 commit comments

Comments
 (0)