打家劫舍1
class Solution {
public:
int rob(vector<int>& nums)
{
int n=nums.size();
if (nums.size() == 0) return 0;
if (nums.size() == 1) return nums[0];
vector<int>dp(n,0);
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<n;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[n-1];
}
};
打家劫舍2
class Solution {
public:
int rob(vector<int>& nums)
{
int n=nums.size();
if (nums.size() == 0) return 0;
if (nums.size() == 1) return nums[0];
if (nums.size() == 2) return max(nums[0],nums[1]);
vector<int>dp1(n-1,0);
vector<int>dp2(n-1,0);
dp1[0]=nums[0];
dp1[1]=max(nums[0],nums[1]);
for(int i=2;i<n-1;i++)
{
dp1[i]=max(dp1[i-1],dp1[i-2]+nums[i]);
}
dp2[0]=nums[1];
dp2[1]=max(nums[1],nums[2]);
for(int i=2;i<n-1;i++)
{
dp2[i]=max(dp2[i-1],dp2[i-2]+nums[i+1]);
}
return max(dp1[n-2],dp2[n-2]);
}
};
打家劫舍3
class Solution {
public:
int rob(TreeNode* root) {
vector<int> result = robtree(root);
return max(result[0],result[1]);
}
vector<int>robtree(TreeNode* root)
{
if(root==NULL) return {0,0};
vector<int> left = robtree(root->left);
vector<int> right = robtree(root->right);
int v1=root->val+left[0]+right[0];
int v2=max(left[0],left[1])+max(right[0],right[1]);
return {v2,v1};
}
};
打家劫舍4
class Solution {
public:
int minCapability(vector<int>& nums, int k)
{
//最大最小二分
vector<int>nums1(nums.begin(),nums.end());
sort(nums1.begin(),nums1.end());
int l=nums1[0],r=nums1.back();
int n=nums.size();
int dp[n+2];
while(l<r)
{
int m=(l+r)/2;
memset(dp, 0, sizeof(dp));
for (int i = 2; i <= n+1; ++ i)
{
if (nums[i-2] <= m)
{
dp[i] = max(dp[i-1], dp[i-2] + 1);
}
else
{
dp[i] = dp[i-1];
}
}
if(dp[n+1]>=k)
{
r = m;
}
//要求的最大值 太小 偷的次数需要很小 但是最少为k 所以 要求的最大值 变大一点
else {
l= m + 1;
}
}
return r;
}
};