leetcode[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 system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.这道题大概意思是给一个数组,不能选择相邻的数字,选出这个数组的最大不相邻子数组之和。这道题感觉好解,但是有一个点:不能选相邻的。意味着我可以选1,3,5,7,9,或者1,3,6,8,10。这其中距离有差2的,有差3的。所以单纯用距离2去计算转移状态是错误的。下面是我的算法:
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.
Example 1:
Input: [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: [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.
public static int rob(int[] nums) {
int length = nums.length;
if(length==0){
return 0;
}
if(length==1){
return nums[0];
}
if(length==2){
return Math.max(nums[0], nums[1]);
}
int f[] = new int[length];
f[0]=nums[0];
f[1] = nums[1];
f[2] = Math.max(nums[0]+nums[2],nums[2]);
for (int i = 3;
i < nums.length;
i++) {
f[i] = Math.max(Math.max(f[i-2], f[i-3])+nums[i], f[i-1]);
}int res=Integer.MIN_VALUE;
for (int i = 0;
i < f.length;
i++) {
res=f[i]>res?f[i]:res;
}
return res;
}
【leetcode[198](House Robber)】
文章图片
推荐阅读
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- leetcode|leetcode 92. 反转链表 II
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- LeetCode(03)Longest|LeetCode(03)Longest Substring Without Repeating Characters
- Leetcode|Leetcode No.198打家劫舍
- [leetcode数组系列]1两数之和
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路
- LeetCode|LeetCode 876. 链表的中间结点