代码随想录算法训练营第四十三天 | 最后一块石头的重量 II、目标和、一和零
● 今日学习的文章链接和视频链接
● 看到题目的第一想法
多重背包这些到底是什么鬼
● 看完代码随想录之后的想法
难
● 实现过程中遇到哪些困难
都难
● 解题代码
-
点击查看代码
class Solution { public int lastStoneWeightII(int[] stones) { int sum = 0; for (int i : stones) { sum += i; } int target = sum >> 1; //初始化dp数组 int[] dp = new int[target + 1]; for (int i = 0; i < stones.length; i++) { //采用倒序 for (int j = target; j >= stones[i]; j--) { //两种情况,要么放,要么不放 dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]); } } return sum - 2 * dp[target]; } } -
点击查看代码
class Solution { public int findTargetSumWays(int[] nums, int target) { int sum = 0; for (int i = 0; i < nums.length; i++) sum += nums[i]; //如果target过大 sum将无法满足 if ( target < 0 && sum < -target) return 0; if ((target + sum) % 2 != 0) return 0; int size = (target + sum) / 2; if(size < 0) size = -size; int[] dp = new int[size + 1]; dp[0] = 1; for (int i = 0; i < nums.length; i++) { for (int j = size; j >= nums[i]; j--) { dp[j] += dp[j - nums[i]]; } } return dp[size]; } } -
点击查看代码
class Solution { public int findMaxForm(String[] strs, int m, int n) { //dp[i][j]表示i个0和j个1时的最大子集 int[][] dp = new int[m + 1][n + 1]; int oneNum, zeroNum; for (String str : strs) { oneNum = 0; zeroNum = 0; for (char ch : str.toCharArray()) { if (ch == '0') { zeroNum++; } else { oneNum++; } } //倒序遍历 for (int i = m; i >= zeroNum; i--) { for (int j = n; j >= oneNum; j--) { dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1); } } } return dp[m][n]; } }
● 今日收获,学习时长
今日收获:日后再补!
学习时长:1.5h
浙公网安备 33010602011771号