目录
一、斐波那契数
二、爬楼梯
三、使用最小花费爬楼梯
四、不同路径
五、分割等和子集
六、最后一块石头的重量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)
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;
}
}
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
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;
}
}