代码随想录算法训练营第三十一天

LeetCode题目:

  • [1049. 最后一块石头的重量 II](#1049. 最后一块石头的重量 II)
  • [494. 目标和](#494. 目标和)
  • [474. 一和零](#474. 一和零)
  • [1295. 统计位数为偶数的数字(每日一题)](#1295. 统计位数为偶数的数字(每日一题))

其他:

今日总结
往期打卡


1049. 最后一块石头的重量 II

跳转:
学习: 代码随想录公开讲解

问题:

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

每一回合,从中选出任意两块石头 ,然后将它们一起粉碎。假设石头的重量分别为 xy,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x

最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0

思路:

尽量凑成大小差不多的两组,两组间相互碰撞剩下的就是 总和 − 2 ∗ 小组和 总和-2*小组和 总和−2∗小组和

复杂度:

  • 时间复杂度: O ( n ∗ S u m ) O(n*Sum) O(n∗Sum)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

java 复制代码
class Solution {
    public int lastStoneWeightII(int[] stones) {
        int sum = 0;
        for(int i:stones){
            sum+=i;
        }
        int t = sum;
        sum/=2;
        int n = stones.length;
        int[] dp = new int[sum+1];
        for(int i=0;i<n;i++){
            for(int j=sum;j>=stones[i];j--){
                    dp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }
        return t-dp[sum]*2;
    }
}

494. 目标和

跳转:
学习: 代码随想录公开讲解

问题:

给你一个非负整数数组 nums 和一个整数 target

向数组中的每个整数前添加 '+''-' ,然后串联起所有整数,可以构造一个 表达式

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1"

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

思路:

递推公式为:
d p [ j ] = d p [ j ] + d p [ j − n u m s [ i ] ] 加和为 j 的数量 = 旧数 + 选上到上一个数加和为 j − n u m s [ i ] 的数量 dp[j] = dp[j] + dp[j-nums[i]] \\ 加和为j的数量 = 旧数+选上到上一个数加和为j-nums[i]的数量 dp[j]=dp[j]+dp[j−nums[i]]加和为j的数量=旧数+选上到上一个数加和为j−nums[i]的数量

复杂度:

  • 时间复杂度: O ( n ∗ S u m ) O(n*Sum) O(n∗Sum)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

java 复制代码
class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum = 0;
        for(int i:nums){
            sum+=i;
        }
        int t = sum+target;
        if(t%2!=0) return 0;
        t = t<0?sum-t/2:t/2;
        int n = nums.length;
        int[] dp = new int[t+1];
        dp[0] = 1;
        for(int i=0;i<n;i++){
            for(int j=t;j>=nums[i];j--){
                    dp[j] = dp[j] + dp[j-nums[i]];
            }
        }
        return dp[t];
    }
}

474. 一和零

跳转:
学习: 代码随想录公开讲解

问题:

给你一个二进制字符串数组 strs 和两个整数 mn

请你找出并返回 strs 的最大子集的长度,该子集中 最多m0n1

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y子集

思路:

二维花费相比一维花费只需要多一层for循环遍历二维背包数组即可

复杂度:

  • 时间复杂度: O ( l ∗ n ∗ m ) O(l*n*m) O(l∗n∗m)
  • 空间复杂度: O ( n ∗ m ) O(n*m) O(n∗m)

代码:

java 复制代码
class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        int len = strs.length;
        int[][] dp = new int[m+1][n+1];
        for(int k=0;k<len;k++){
            int oneNum = 0;
            int zeroNum = 0;
            for(char c:strs[k].toCharArray()){
                if(c=='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-zeroNum][j-oneNum]+1,dp[i][j]);
                }
            }
        }
        return dp[m][n];
    }
}

1295. 统计位数为偶数的数字(每日一题)

跳转:

问题:

给你一个整数数组 nums,请你返回其中包含 偶数 个数位的数字的个数。

思路:

遍历一遍统一位数,偶数则计数

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

java 复制代码
class Solution {
    public int findNumbers(int[] nums) {
        int ans = 0;
        for(int i:nums){
            int bit = 0;
            while(i>0){
                bit++;
                i/=10;
            }
            if(bit%2==0) ans++;
        }
        return ans;
    }
}

总结

学习了01背包求方案数,二维花费01背包

往期打卡

代码随想录算法训练营第三十天(补)

代码随想录算法训练营第二十九天

代码随想录算法训练营第二十八天

代码随想录算法训练营第二十七天(补)

代码随想录算法训练营第二十六天

代码随想录算法训练营第二十五天

代码随想录算法训练营第二十四天

代码随想录算法训练营第二十三天

代码随想录算法训练营周末四

代码随想录算法训练营第二十二天(补)

代码随想录算法训练营第二十一天

代码随想录算法训练营第二十天

代码随想录算法训练营第十九天

代码随想录算法训练营第十八天

代码随想录算法训练营第十七天

代码随想录算法训练营周末三

代码随想录算法训练营第十六天

代码随想录算法训练营第十五天

代码随想录算法训练营第十四天

代码随想录算法训练营第十三天

代码随想录算法训练营第十二天

代码随想录算法训练营第十一天

代码随想录算法训练营周末二

代码随想录算法训练营第十天

代码随想录算法训练营第九天

代码随想录算法训练营第八天

代码随想录算法训练营第七天

代码随想录算法训练营第六天

代码随想录算法训练营第五天

代码随想录算法训练营周末一

代码随想录算法训练营第四天

代码随想录算法训练营第三天

代码随想录算法训练营第二天

代码随想录算法训练营第一天

*[474. 一和零]: LeetCode
*[1049. 最后一块石头的重量 II]: LeetCode
*[494. 目标和]: LeetCode
*[1295. 统计位数为偶数的数字]: LeetCode

相关推荐
能工智人小辰17 分钟前
Codeforces Round 509 (Div. 2) C. Coffee Break
c语言·c++·算法
kingmax5421200818 分钟前
CCF GESP202503 Grade4-B4263 [GESP202503 四级] 荒地开垦
数据结构·算法
岁忧23 分钟前
LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上
sql·算法·leetcode
eachin_z1 小时前
力扣刷题(第四十九天)
算法·leetcode·职场和发展
闻缺陷则喜何志丹1 小时前
【强连通分量 缩点 拓扑排序】P3387 【模板】缩点|普及+
c++·算法·拓扑排序·洛谷·强连通分量·缩点
机器学习之心2 小时前
机器学习用于算法交易(Matlab实现)
算法·机器学习·matlab
AL流云。2 小时前
【优选算法】C++滑动窗口
数据结构·c++·算法
qq_429879673 小时前
省略号和可变参数模板
开发语言·c++·算法
飞川撸码4 小时前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
Neil今天也要学习4 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法