你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 0){
return 0;
}
if(n == 1){
return nums[0];
}
vector<int> sums(n+1,0);
sums[0] = 0;
sums[1] = nums[0];
for(int i=2;i<=n;++i){
sums[i] = max(sums[i-2]+nums[i-1],sums[i-1]);
}
return max(sums[n],sums[n-1]);
}
};
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
class Solution {
public:
int robsub(vector<int> nums){
int n = nums.size();
vector<int> sums(n+1,0);
sums[0] = 0;
sums[1] = nums[0];
for(int i=2;i<=n;++i){
sums[i] = max(sums[i-2]+nums[i-1],sums[i-1]);
}
return max(sums[n],sums[n-1]);
}
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 0){
return 0;
}
if(n == 1){
return nums[0];
}
if(n == 2){
return max(nums[0],nums[1]);
}
vector<int> n1(nums.begin(), nums.end()-1);
vector<int> n2(nums.begin()+1, nums.end());
return max(robsub(n1),robsub(n2));
}
};
给你一个整数数组 nums
,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i]
,删除它并获得 nums[i]
的点数。之后,你必须删除 所有 等于 nums[i] - 1
和 nums[i] + 1
的元素。
开始你拥有 0
个点数。返回你能通过这些操作获得的最大点数。
(官方解答)
class Solution {
public:
int rob(vector<int> &nums) {
int n = nums.size();
int first = nums[0], second = max(nums[0], nums[1]);
for (int i = 2; i < n; i++) {
int temp = second;
second = max(first + nums[i], second);
first = temp;
}
return second;
}
int deleteAndEarn(vector<int>& nums) {
int maxVal = 0;
for (int val : nums) {
maxVal = max(maxVal, val);
}
vector<int> sum(maxVal + 1);
for (int val : nums) {
sum[val] += val;
}
return rob(sum);
}
};