LeetCode //C - 198. House Robber

198. House Robber

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security systems connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given an integer array nums representing the amount of money of each house, return the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: nums = [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).

Total amount you can rob = 1 + 3 = 4.

Example 2:

Input: nums = [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).

Total amount you can rob = 2 + 9 + 1 = 12.

Constraints:
  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

From: LeetCode

Link: 198. House Robber


Solution:

Ideas:
  • We handle base cases where the size of nums is 0 or 1.
  • We create an array dp to store the maximum amount that can be robbed up to each house.
  • The first element of dp is the amount in the first house, and the second element is the maximum of the first two houses.
  • For each subsequent house i, we calculate the maximum amount that can be robbed by comparing:
    • The amount robbed by robbing the current house i (which is nums[i] + dp[i - 2]) and not robbing the immediate previous house.
    • The amount robbed by not robbing the current house (which is dp[i - 1]).
  • Finally, we return the last element of the dp array, which represents the maximum amount that can be robbed from the entire street.
Code:
c 复制代码
int rob(int* nums, int numsSize) {
    if (numsSize == 0) return 0;
    if (numsSize == 1) return nums[0];

    int dp[numsSize];
    dp[0] = nums[0];
    dp[1] = nums[1] > nums[0] ? nums[1] : nums[0];

    for (int i = 2; i < numsSize; i++) {
        dp[i] = (nums[i] + dp[i - 2]) > dp[i - 1] ? nums[i] + dp[i - 2] : dp[i - 1];
    }

    return dp[numsSize - 1];
}
相关推荐
被制作时长两年半的个人练习生3 分钟前
近期的笔试和面试的复盘
算法·面试·职场和发展·算子
gsfl1 小时前
贪心算法1
算法·贪心算法
小猪咪piggy1 小时前
【算法】day8 二分查找+前缀和
算法
Word码1 小时前
[排序算法]希尔排序
c语言·数据结构·算法·排序算法
前端小刘哥1 小时前
解析视频直播点播平台EasyDSS在视频点播领域的技术架构与性能优势
算法
QT 小鲜肉2 小时前
【数据结构与算法基础】05. 栈详解(C++ 实战)
开发语言·数据结构·c++·笔记·学习·算法·学习方法
lingran__2 小时前
算法沉淀第七天(AtCoder Beginner Contest 428 和 小训练赛)
c++·算法
前端小刘哥2 小时前
新版视频直播点播平台EasyDSS,打通远程教研与教师培训新通路
算法
2401_840105202 小时前
P1049 装箱问题 题解(四种方法)附DP和DFS的对比
c++·算法·深度优先·动态规划
kobe_t2 小时前
数据安全系列7:常用的非对称算法浅析
算法