LeetCode——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 system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Credits:
Special thanks to @ifanchu for adding this problem and creating all test cases. Also thanks to @ts for adding additional test cases.

解题思路

很明显,这是一道动态规划的题目,在tag中也标明了。
可以这样分析:
先说明两个数组的含义:
rob[N]:表示到第N家商户的最大化收益
notRob[N]:表示在不抢劫第N家商户的前提下的最大化收益。
继续…..
如果这条街道上只有一家商户,为了利益最大化,你决定抢,则为rob[0] = num.at(0),但是你忽然发善心,不抢了,则notRob[0] = 0.
之后这条街道繁荣起来了,商户变多,假设有N家商户,此时你已经“处理(抢或者不抢巴拉巴拉)”了前N-1家商户,来到了第N家商户的门前。那么摆在你面前的选择题如下:
1、对第N家商户不抢,则你的最大化收益就是截止到第N-1商户的收益,即notRob[N] = r[N - 1];
rob[N] = rob[N - 1];
2、假设你要对第N家商户动手,那么有一个重要的前提就是:你没有抢劫第N-1家商户。则收益为
rob[N] = notRob[N - 1] + num.at(N) > rob[N] ? notRob[N - 1] + num.at(N) : rob[N];

按照这个规则你一直抢到最后一家商户,比较一下notRob[N]和rob[N]哪个比较大就ok了。

(PS:可能还要压缩的空间。。但是这样比较直观。。)

class Solution {
public:
    int * r;
    int * nr;

    int rob(vector<int> &num) {
        if(0 == num.size())
        {
            return 0;
        }

        r = new int[num.size()];
        nr = new int[num.size()];

        //第一家的值就是默认的
        r[0] = num.at(0);
        nr[0] = 0;

        //以下把day看成loc就好,就是挨个从到到位打劫一遍
        for(int day = 1; day <= num.size() - 1; ++day)
        {
            //不抢劫的最大化值
            nr[day] = r[day - 1];
            //抢劫的最大化值
            r[day] = nr[day - 1] + num.at(day);
            if(r[day - 1] > r[day])
            {
                r[day] = r[day - 1];
            }
        }

        int re = nr[num.size() - 1];
        if(re < r[num.size() - 1])
        {
            re = r[num.size() - 1];
        }

        return re;
    }
};
### 力扣热门100题列表 力扣(LeetCode)上的热门题目通常是指那些被广泛讨论、高频面试或者具有较高难度的题目。这些题目涵盖了数据结构和算法的核心知识点,适合用来提升编程能力和解决实际问题的能力。 以下是基于社区反馈整理的部分 **LeetCode Hot 100 Problems List**: #### 数组与字符串 1. Two Sum (两数之和)[^1] 2. Longest Substring Without Repeating Characters (无重复字符的最长子串)[^2] 3. Median of Two Sorted Arrays (两个有序数组的中位数)[^1] 4. Container With Most Water (盛最多水的容器)[^2] #### 链表 5. Reverse Linked List (反转链表) 6. Merge Two Sorted Lists (合并两个有序链表) 7. Remove Nth Node From End of List (删除倒数第N个节点) 8. Linked List Cycle II (环形链表II) #### 堆栈与队列 9. Valid Parentheses (有效的括号) 10. Min Stack (最小栈) 11. Sliding Window Maximum (滑动窗口最大值)[^2] #### 树与二叉树 12. Binary Tree Inorder Traversal (二叉树的中序遍历) 13. Validate Binary Search Tree (验证二叉搜索树) 14. Same Tree (相同的树) 15. Serialize and Deserialize Binary Tree (序列化与反序列化二叉树) #### 图论 16. Number of Islands (岛屿数量) 17. Course Schedule (课程表) 18. Clone Graph (克隆图) #### 排序与搜索 19. Find First and Last Position of Element in Sorted Array (在排序数组中查找元素的第一个和最后一个位置) 20. Search a 2D Matrix (二维矩阵搜索) 21. K Closest Points to Origin (最接近原点的K个点) #### 动态规划 22. Climbing Stairs (爬楼梯) 23. House Robber (打家劫舍)[^1] 24. Coin Change (零钱兑换) 25. Unique Paths (不同路径) #### 贪心算法 26. Jump Game (跳跃游戏)[^1] 27. Non-overlapping Intervals (无重叠区间) 28. Best Time to Buy and Sell Stock (买卖股票的最佳时机)[^1] #### 字符串匹配与处理 29. Implement strStr() (实现strStr()) 30. Longest Consecutive Sequence (最长连续序列) 31. Group Anagrams (分组异位词) --- ### 示例代码片段 以下是一个关于动态规划的经典例子——`Climbing Stairs` 的 Python 实现: ```python class Solution: def climbStairs(self, n: int) -> int: if n == 1 or n == 2: return n dp = [0] * (n + 1) dp[1], dp[2] = 1, 2 for i in range(3, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n] ``` 上述代码通过动态规划的方式解决了 `Climbing Stairs` 问题,时间复杂度为 \(O(n)\),空间复杂度同样为 \(O(n)\)[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值