打家劫舍几道题
- 打家劫舍
class Solution {
public:
int rob(vector<int>& nums) {
int len = nums.size();
if(len==0){
return 0;
}
if(len==1){
return nums[0];
}
vector<int> dp = vector<int>(len);
dp[0] = nums[0];
dp[1] = max(nums[0],nums[1]);
for(int i =2;i< len ; i++){
dp[i] = max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[len-1];
}
};
打家劫舍2
难点在于怎么处理数组,这道题将数组转化为能使用动态规划的数组即可.
如果偷了下标为0的房屋,则要算到下标length-2为止的最大数量
如果偷了下标为1的房屋,则要算下标length-1为止的最大数量
class Solution {
public:
int rob(vector<int>& nums) {
int len = nums.size();
if(len==1){
return nums[0];
}
else if(len==2){
return max(nums[0],nums[1]);
}
return max(robr(nums,0,len-2),robr(nums,1,len-1));
}
int robr(vector<int>& nums,int start,int end){
int len = nums.size();
int first = nums[start];
int second = max(nums[start],nums[start+1]);
for(int i = start+2;i<=end;i++){
int t = second;
second = max(first+nums[i],second);
first = t;
}
return second;
/*
vector<int> dp = vector<int>(end-start+1);
dp[0] =nums[start];
dp[1] = max (nums[start] ,nums[start+1]);
int j = 2;
for(int i =start+2;i<=end;i++){
dp[j] = max(dp[j-2]+nums[i],dp[j-1]);
j=j+1;
}
return dp[j-1];
*/
}
};
740.删除并获得点数https://leetcode-cn.com/problems/delete-and-earn/
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于**nums[i] - 1 和 nums[i] + 1 **的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
删元素等同于选了下标a,就不能选a-1,a+1;删了多少点数就等于获得了多少钱
因此dp[i]=dp[i-2]+sums[dp[i]]
class Solution {
private:
int rob(vector<int> &nums) {
int size = nums.size();
int first = nums[0], second = max(nums[0], nums[1]);
for (int i = 2; i < size; i++) {
int temp = second;
second = max(first + nums[i], second);
first = temp;
}
return second;
}
public:
int deleteAndEarn(vector<int> &nums) {
int maxVal = 0;
for (int val : nums) {
maxVal = max(maxVal, val);
}
//上面这段代码是算你要构造的sums的长度是从0开始的
vector<int> sum(maxVal + 1);
for (int val : nums) {
sum[val] += val;
}
return rob(sum);
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/delete-and-earn/solution/shan-chu-bing-huo-de-dian-shu-by-leetcod-x1pu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。