Skip to content

Commit ebdeffe

Browse files
Refine
Signed-off-by: begeekmyfriend <begeekmyfriend@gmail.com>
1 parent 0413736 commit ebdeffe

File tree

2 files changed

+22
-21
lines changed

2 files changed

+22
-21
lines changed

198_house_robber/robber.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,22 @@ static inline int max(int a, int b)
99

1010
static int rob(int* nums, int numsSize)
1111
{
12-
int i;
13-
int **money = malloc((numsSize + 1) * sizeof(int *));
14-
for (i = 0; i < numsSize + 1; i++) {
15-
money[i] = malloc(2 * sizeof(int));
16-
memset(money[i], 0, 2 * sizeof(int));
12+
if (numsSize == 0) {
13+
return 0;
1714
}
1815

19-
for (i = 1; i <= numsSize; i++) {
20-
int cash = nums[i - 1];
21-
money[i][0] = max(money[i - 1][0], money[i - 1][1]);
22-
money[i][1] = money[i - 1][0] + cash;
16+
int i;
17+
int taken = nums[0];
18+
int untaken = 0;
19+
/* Record max profits of nums[0...i] respectively */
20+
for (i = 1; i < numsSize; i++) {
21+
int tmp_taken = taken;
22+
int tmp_untaken = untaken;
23+
taken = untaken + nums[i];
24+
untaken = max(tmp_taken, tmp_untaken);
2325
}
2426

25-
return max(money[numsSize][0], money[numsSize][1]);
27+
return max(taken, untaken);
2628
}
2729

2830
int main(int argc, char **argv)

213_house_robber_ii/robber.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,17 @@ static inline int max(int a, int b)
1010
static int _rob(int* nums, int numsSize)
1111
{
1212
int i;
13-
int **money = malloc((numsSize + 1) * sizeof(int *));
14-
for (i = 0; i < numsSize + 1; i++) {
15-
money[i] = malloc(2 * sizeof(int));
16-
memset(money[i], 0, 2 * sizeof(int));
13+
int taken = nums[0];
14+
int untaken = 0;
15+
/* Record max profits of nums[0...i] respectively */
16+
for (i = 1; i < numsSize; i++) {
17+
int tmp_taken = taken;
18+
int tmp_untaken = untaken;
19+
taken = tmp_untaken + nums[i];
20+
untaken = max(tmp_taken, tmp_untaken);
1721
}
1822

19-
for (i = 1; i <= numsSize; i++) {
20-
int cash = nums[i - 1];
21-
money[i][0] = max(money[i - 1][0], money[i - 1][1]);
22-
money[i][1] = money[i - 1][0] + cash;
23-
}
24-
25-
return max(money[numsSize][0], money[numsSize][1]);
23+
return max(taken, untaken);
2624
}
2725

2826
static int rob(int* nums, int numsSize)
@@ -32,6 +30,7 @@ static int rob(int* nums, int numsSize)
3230
} else if (numsSize == 1) {
3331
return nums[0];
3432
} else {
33+
/* The first and the last element are adjacent */
3534
return max(_rob(nums + 1, numsSize - 1), _rob(nums, numsSize - 1));
3635
}
3736
}

0 commit comments

Comments
 (0)