Day42题目
LeetCode1049.最后一块石头的重量
核心思想:将这个问题转化成选择两组重量差不多的石头的01背包问题
class Solution {
public int lastStoneWeightII(int[] stones) {
// 转化为选择两组相同重量的石头
int sum = 0;
for (int i = 0; i < stones.length; i++) {
sum += stones[i];
}
int max = stones[0];
int[][] dp = new int[stones.length][sum / 2 + 1];
for(int j = stones[0] ; j <= sum/2; j++ ){
dp[0][j] = stones[0];
}
for (int i = 1; i < dp.length; i++) {
for (int j = 0; j <= sum / 2; j++) {
if (j < stones[i]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - stones[i]] + stones[i]);
max = Math.max(max, dp[i][j]);
}
}
}
return Math.abs(sum - max - max);
}
}
LeetCode目标和
核心思想:将这个问题转化成选择和为sum-target的个数,把sum-target的个数置为负数,那么得到结果就是target
class Solution {
public int findTargetSumWays(int[] nums, int target) {
// dp[j] 为可以凑成j的方法数量
int sum = 0;
for(int i = 0 ; i < nums.length ; i ++){
sum += nums[i];
}
if(sum < Math.abs(target) || (target+ sum)%2 == 1){
return 0;
}
// x - (sum-x) = target
// x = (sum+target)/2
int bagSize = (sum+target)/2;
int[] dp = new int[bagSize+1];
dp[0] = 1;
for(int i = 0; i < nums.length ; i ++){
for(int j = bagSize ; j >= nums[i]; j --){
dp[j] += dp[j-nums[i]];
}
}
return dp[bagSize];
}
}
LeetCode474.一和零
核心思想:dp二维容量数组,分别记录1和0的容量
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m+1][n+1];
for(String str: strs){
int zeroCount =0 ;
int oneCount = 0;
for(int i = 0 ; i < str.length();i ++){
if(str.charAt(i) == '0'){
zeroCount++;
}else{
oneCount++;
}
}
for(int i = m ; i >= zeroCount ; i --){
for(int j = n ; j >= oneCount ; j --){
// 该dp[i-zeroCount][j-oneCount]为当前容量刚好可以容纳当前元素之前的最长长度,+1即可
dp[i][j] = Math.max(dp[i][j],dp[i-zeroCount][j-oneCount]+1);
}
}
}
return dp[m][n];
}
}
310



被折叠的 条评论
为什么被折叠?



