动态规划篇

目录

一、斐波那契数

二、爬楼梯

三、使用最小花费爬楼梯

四、不同路径

五、分割等和子集

六、最后一块石头的重量II

七、目标和

八、一和零

九、零钱兑换

十、组合总和IV

十一、完全平方数

十二、单词拆分

十三、打家劫舍

十四、买卖股票的最佳时机

十五、买卖股票的最佳时机含冷冻期

十六、买卖股票的最佳时机含手续费

十七、最长递增子序列 

十八、最长连续递增子序列

十九、最长重复子数组


一、斐波那契数

509. 斐波那契数 - 力扣(LeetCode)

//动态规划
class Solution {
    public int fib(int n) {
        if(n<=1)return n;
        int dp[]=new int[2];
        dp[0]=0;
        dp[1]=1;
        for(int i=2;i<=n;i++){
            int sum=dp[0]+dp[1];
            dp[0]=dp[1];
            dp[1]=sum;
        }
        return dp[1];
    }
}

//递归法
class Solution {
    public int fib(int n) {
        if(n==0)return 0;
        if(n==1)return 1;
        return fib(n-1)+fib(n-2);
    }
}

二、爬楼梯

70. 爬楼梯 - 力扣(LeetCode)

class Solution {
    public int climbStairs(int n) {
        if(n<=2)return n;
        int dp[]=new int[3];
        dp[0]=0;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++){
            int sum=dp[1]+dp[2];
            dp[1]=dp[2];
            dp[2]=sum;
        }
        return dp[2];
    }
}

三、使用最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int dp0=0;
        int dp1=0;
        for(int i=2;i<=cost.length;i++){
            int dpi=Math.min(dp1+cost[i-1],dp0+cost[i-2]);
            dp0=dp1;
            dp1=dpi;
        }
        return dp1;
    }
}

四、不同路径

62. 不同路径 - 力扣(LeetCode)

动态规划篇_第1张图片

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp=new int[m][n];
        for(int i=0;i

63. 不同路径 II - 力扣(LeetCode)

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m=obstacleGrid.length;
        int n=obstacleGrid[0].length;
        int[][] dp=new int[m][n];
        if(obstacleGrid[m-1][n-1]==1||obstacleGrid[0][0]==1)return 0;
        for(int i=0;i

五、分割等和子集

416. 分割等和子集 - 力扣(LeetCode)

class Solution {
    public boolean canPartition(int[] nums) {
        int l=nums.length;
        if(l==0||nums==null)return false;
        int sum=0;
        for(int num:nums)sum+=num;
        if(sum%2!=0)return false;
        int target=sum/2;
        int dp[]=new int[target+1];
        for(int i=0;i=nums[i];j--){
                dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);
            }
            if(dp[target]==target)return true;
        }
        return dp[target]==target;
    }
}

六、最后一块石头的重量II

1049. 最后一块石头的重量 II - 力扣(LeetCode)

class Solution {
    public int lastStoneWeightII(int[] stones) {
        int sum=0;
        for(int stone:stones)sum+=stone;
        int target=sum/2;
        int dp[]=new int[target+1];
        for(int i=0;i=stones[i];j--){
                dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }
        return sum-dp[target]-dp[target];
    }
}

七、目标和

494. 目标和 - 力扣(LeetCode)

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum=0;
        for(int num:nums)sum+=num;
        if(Math.abs(target)>sum||(target+sum)%2==1)return 0;
        int bagsize=(target+sum)/2;
        int dp[]=new int[bagsize+1];
        dp[0]=1;
        for(int i=0;i=nums[i];j--){
                dp[j]+=dp[j-nums[i]];
            }
        }
        return dp[bagsize];
    }
}

八、一和零

474. 一和零 - 力扣(LeetCode)

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        int dp[][]=new int[m+1][n+1];
        for(String str:strs){
            int zero=0,one=0;
            for(char c:str.toCharArray()){
                if(c=='0')zero++;
                else one++;
            }
            for(int i=m;i>=zero;i--){
                for(int j=n;j>=one;j--){
                    dp[i][j]=Math.max(dp[i][j],dp[i-zero][j-one]+1);
                }
            }
        }
        return dp[m][n];
    }
}

九、零钱兑换

518. 零钱兑换 II - 力扣(LeetCode)

class Solution {
    public int change(int amount, int[] coins) {
        int[][] dp=new int[coins.length][amount+1];
        for(int i=0;i

322. 零钱兑换 - 力扣(LeetCode)

class Solution {
    public int coinChange(int[] coins, int amount) {
         int max = Integer.MAX_VALUE;
        int[] dp = new int[amount + 1];
        for(int i=0;i<=amount;i++)dp[i]=max;
        dp[0]=0;
        for(int i=0;i

十、组合总和IV

377. 组合总和 Ⅳ - 力扣(LeetCode)

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int dp[]=new int[target+1];
        dp[0]=1;
        for(int i=0;i<=target;i++){
            for(int j=0;j=nums[j])dp[i]+=dp[i-nums[j]];
            }
        }
        return dp[target];
    }
}

十一、完全平方数

279. 完全平方数 - 力扣(LeetCode)

class Solution {
    public int numSquares(int n) {
        int max=Integer.MAX_VALUE;
        int dp[]=new int[n+1];
        for(int i=0;i

十二、单词拆分

139. 单词拆分 - 力扣(LeetCode)

class Solution {
    public boolean wordBreak(String s, List wordDict) {
        HashSet set=new HashSet<>(wordDict);
        boolean dp[]=new boolean[s.length()+1];
        dp[0]=true;
        for(int i=1;i

十三、打家劫舍

198. 打家劫舍 - 力扣(LeetCode)

class Solution {
    public int rob(int[] nums) {
        if(nums.length==0)return 0;
        if(nums.length==1)return nums[0];
        int[] dp=new int[nums.length];
        dp[0]=nums[0];
        dp[1]=Math.max(nums[0],nums[1]);
        for(int i=2;i

213. 打家劫舍 II - 力扣(LeetCode)

class Solution {
    public int rob(int[] nums) {
        if(nums==null)return 0;
        if(nums.length==1)return nums[0];
        return Math.max(robChoose(nums,0,nums.length-2),robChoose(nums,1,nums.length-1));
    }
    public int robChoose(int[] nums,int start,int end){
        if(start==end)return nums[start];
        int[] dp=new int[nums.length];
        dp[start]=nums[start];
        dp[start+1]=Math.max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++)dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
        return dp[end];
    }
}

337. 打家劫舍 III - 力扣(LeetCode)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int rob(TreeNode root) {
        int[] dp=robTree(root);
        return Math.max(dp[0],dp[1]);
    }
    public int[] robTree(TreeNode root){
        int[] res=new int[2];
        if(root==null)return res;
        int[] left=robTree(root.left);
        int[] right=robTree(root.right);
        res[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]);
        res[1]=root.val+left[0]+right[0];
        return res;
    }
}

十四、买卖股票的最佳时机

121. 买卖股票的最佳时机 - 力扣(LeetCode)

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length==0)return 0;
        int[] dp[]=new int[prices.length][2];
        dp[0][0]-=prices[0];
        dp[0][1]=0;
        for(int i=1;i

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

//方法一
class Solution {
    public int maxProfit(int[] prices) {
        int l=prices.length;
        int[] dp[]=new int[l][2];
        dp[0][0]-=prices[0];
        dp[0][1]=0;
        for(int i=1;i

123. 买卖股票的最佳时机 III - 力扣(LeetCode)

class Solution {
    public int maxProfit(int[] prices) {
        int l=prices.length;
        if(l==0)return 0;
        int[][] dp=new int[l][5];
        dp[0][1]=-prices[0];
        dp[0][3]=-prices[0];
        for(int i=1;i

188. 买卖股票的最佳时机 IV - 力扣(LeetCode)

class Solution {
    public int maxProfit(int k, int[] prices) {
        int l=prices.length;
        if(l==0)return 0;
        int dp[][]=new int[l][2*k+1];
        for(int i=1;i<2*k;i+=2)dp[0][i]=-prices[0];
        for(int i=1;i

十五、买卖股票的最佳时机含冷冻期

309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length==0)return 0;
        int[][] dp=new int[prices.length][4];
        dp[0][0]-=prices[0];
        for(int i=1;i

十六、买卖股票的最佳时机含手续费

714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int[][] dp=new int[prices.length][2];
        dp[0][0]-=prices[0];
        for(int i=1;i

十七、最长递增子序列 

300. 最长递增子序列 - 力扣(LeetCode)

class Solution {
    public int lengthOfLIS(int[] nums) {
        if(nums.length<=1)return nums.length;
        int[] dp=new int[nums.length];
        Arrays.fill(dp,1);
        int result=0;
        for(int i=1;inums[j])dp[i]=Math.max(dp[i],dp[j]+1);
            }
            if(dp[i]>result)result=dp[i];
        }
        return result;
    }
}

十八、最长连续递增子序列

674. 最长连续递增序列 - 力扣(LeetCode)

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int l=nums.length;
        if(l<=1)return l;
        int result=0;
        int[] dp=new int[l];
        Arrays.fill(dp,1);
        for(int i=1;inums[i-1])dp[i]=dp[i-1]+1;
            if(dp[i]>result)result=dp[i];
        }
        return result;
    }
}

十九、最长重复子数组

718. 最长重复子数组 - 力扣(LeetCode)

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int result=0;
        int[][] dp=new int[nums1.length+1][nums2.length+1];
        for(int i=1;iresult)result=dp[i][j];
            }
        }
        return result;
    }
}

你可能感兴趣的:(LeetCode,动态规划,算法)