文章目录
- 1.爬楼梯No.70
- 2.杨辉三角No.118
- 3.打家劫舍No.198
- 4.完全平方数No.279
- 5.零钱兑换No.322
- 6.单词拆分No.139
- 7.最长递增子序列No.300
- 8.乘积最大子数组No.152
- 9.分割等和子集No.416
1.爬楼梯No.70

class Solution {public int climbStairs(int n) {if (n == 1) {return 1;}int[] dp = new int[n + 1];dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2]; }return dp[n]; }
}
2.杨辉三角No.118

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> triangle = new ArrayList<>();for (int row = 0; row < numRows; row++) {List<Integer> currentRow = new ArrayList<>();currentRow.add(1);for (int col = 1; col < row; col++) {List<Integer> prevRow = triangle.get(row - 1);int value = prevRow.get(col - 1) + prevRow.get(col);currentRow.add(value);}if (row > 0) {currentRow.add(1);}triangle.add(currentRow);} return triangle;}
}
3.打家劫舍No.198


class Solution {public int rob(int[] nums) {if (nums == null || 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 < nums.length; i++) {dp[i] = Math.max(dp[i-1], nums[i] + dp[i-2]);}return dp[nums.length - 1]; }
}
4.完全平方数No.279

class Solution {public int numSquares(int n) {int[] dp = new int[n + 1];dp[0] = 0;for (int i = 1; i <= n; i++) {dp[i] = Integer.MAX_VALUE; for (int j = 1; j * j <= i; j++) {dp[i] = Math.min(dp[i], dp[i - j * j] + 1);}}return dp[n];}
}
5.零钱兑换No.322

class Solution {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount + 1];Arrays.fill(dp, amount + 1); dp[0] = 0; for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (i >= coin) {dp[i] = Math.min(dp[i], dp[i - coin] + 1);}}}return dp[amount] == amount + 1 ? -1 : dp[amount];}
}
class Solution {public int coinChange(int[] coins, int amount) {int[] res = new int[amount + 1];Arrays.fill(res,Integer.MAX_VALUE);res[0] = 0;for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (i >= coin&&res[i - coin] != Integer.MAX_VALUE)res[i] = Math.min(res[i], res[i - coin] + 1);}}return res[amount] == Integer.MAX_VALUE ? -1 : res[amount];}
}
6.单词拆分No.139

import java.util.List;
import java.util.HashSet;class Solution {public boolean wordBreak(String s, List<String> wordDict) {HashSet<String> wordSet = new HashSet<>(wordDict);boolean[] dp = new boolean[s.length() + 1];dp[0] = true; for (int i = 1; i <= s.length(); i++) {for (int j = 0; j < i; j++) {if (dp[j] && wordSet.contains(s.substring(j, i))) {dp[i] = true;break; }}}return dp[s.length()];}
}
7.最长递增子序列No.300

public int lengthOfLIS(int[] nums) {int n = nums.length;int[] dp = new int[n];Arrays.fill(dp,1);for(int i = 1;i<n;i++){for(int j = 0;j<i;j++){if(nums[j]<nums[i]){dp[i] = Math.max(dp[j]+1,dp[i]);}}}int res=0;for(int i=0;i<n;i++){res=Math.max(res,dp[i]);}return res;}
8.乘积最大子数组No.152

class Solution {public int maxProduct(int[] nums) {if (nums == null || nums.length == 0) {return 0;}int maxProd = nums[0]; int minProd = nums[0]; int result = nums[0]; for (int i = 1; i < nums.length; i++) {if (nums[i] < 0) {int temp = maxProd;maxProd = minProd;minProd = temp;}maxProd = Math.max(nums[i], maxProd * nums[i]);minProd = Math.min(nums[i], minProd * nums[i]);result = Math.max(result, maxProd);}return result;}
}
9.分割等和子集No.416

class Solution {public boolean canPartition(int[] nums) {if(nums == null || nums.length == 0) return false;int n = nums.length;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 < n; i++) {for(int j = target; j >= 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;}
}