拜托世界包容我

198. 打家劫舍

class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n+1,0);
        // dp[i]=dp[i-2]+nums[i];
        if(n==0)return 0;
        if(n==1)return nums[0];
        dp[0]=nums[0];
        dp[1]=nums[1];
        int res=max(dp[0],dp[1]);
        for(int i=2;i<n;i++){
            dp[i]=dp[i-2]+nums[i];
            res=max(res,dp[i]);
        }
        return res;
    }
};
class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n+1,0);
        // dp[i]=dp[i-2]+nums[i];
        if(n==0)return 0;
        if(n==1)return nums[0];
        dp[0]=0;
        dp[1]=nums[0]; 
        int res=dp[1];
        for(int i=2;i<=n;i++){
            dp[i]=dp[i-2]+nums[i-1];
            res=max(res,dp[i]);
        }
        return res;
    }
};
class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n+1,0);
        // dp[i]=dp[i-2]+nums[i];
        if(n==0)return 0;
        if(n==1)return nums[0];
        dp[0]=0;
        dp[1]=nums[0]; 
        // int res=dp[1];
        for(int i=2;i<=n;i++){
            dp[i]=max(dp[i-2]+nums[i-1],dp[i-1]);
            // res=max(res,dp[i]);
        }
        // return res;
        return dp[n];
    }
};

状态递推,每步的状态要更新到最优,后一步的最优才能由前一步的递推得到

26. 删除有序数组中的重复项

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n=nums.size();
        int l=0;
        int bs=nums[0];
        for(int i=1;i<n;i++){
            while(nums[i]==bs)i++;
            nums[l++]=bs;
            
            bs=nums[i];
            // if(i==n-1)nums[l++]=bs;
        }
        nums[l++]=bs;
        return l;
    }
};
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n=nums.size();
        if(n==0)return 0;
        // if(n==1)return 1;
        int l=0;
        int bs=nums[0];
        for(int i=1;i<n;i++){
            while(nums[i]==nums[l])i++;
            nums[++l]=nums[i];
            
            // bs=nums[i];
            // if(i==n-1)nums[l++]=bs;
        }
        // nums[l++]=bs;
        return l+1;
    }
};

1,1样例不通过
数组越界
边界条件的特判

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n=nums.size();
        if(n==0)return 0;
        // if(n==1)return 1;
        int l=0;
        int bs=nums[0];
        for(int i=1;i<n;i++){
            while(i<n&&nums[i]==nums[l])i++;
            if(i!=n)nums[++l]=nums[i];

        }

        return l+1;
    }
};

80. 删除有序数组中的重复项 II

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n=nums.size();
        if(n==0)return 0;
        int l=0;
        for(int i=1;i<n;i++){
            if(nums[i]==nums[l]){
                nums[++l]=nums[i];
                while(i<n&&nums[i]==nums[l]){
                i++;
                }
            }
            if(i!=n)nums[++l]=nums[i];
            
        }
        return l+1;
    }
};

你可能感兴趣的:(算法,leetcode,数据结构)