首页 > 编程语言 >代码随想录算法训练营 | 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

代码随想录算法训练营 | 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

时间:2024-10-10 23:21:44浏览次数:7  
标签:target nums int 1049 随想录 II bagSize sum dp

1049. 最后一块石头的重量 II
题目链接:1049. 最后一块石头的重量 II
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰最后一块石头的重量 II
日期:2024-10-10

想法:这这么会是分割等和子集一类的问题。。。
Java代码如下:

class Solution {
    public int lastStoneWeightII(int[] stones) {
        if(stones == null || stones.length == 0) return 0;
        int sum = 0;
        for(int num : stones) {
            sum += num;
        }
        int target = sum / 2;
        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];
    }
}

494. 目标和
题目链接:494. 目标和
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰目标和
日期:2024-10-10

想法:假设加法的总和为bagSize,那么减法对应的总和就是sum - bagSize,所以要求的是 bagSize - (sum - bagSize) = target; bagSize = (target + sum) / 2
此时问题就转化为,用nums装满容量为bagSize的背包,有几种方法。

  1. dp的意思是有多少种组合满足,二维数组dp[i][j]表示nums种0到i的数相加得到j的组合数为dp[i][j],
  2. 递推公式:第一种情况dp[i - 1][j]表示不加上nums[i]这个数时能得到和为j的组合数,第二种情况要加上nums[i],先就得腾出j - nums[i]的空间,看此时dp[i - 1][j - nums[i]]有多少组合,这个组合数就是加上nums[i]总和为j的组合数。
    3.初始化:初始化第一行第一列,第一行j刚好等于nums[0]时会有1种(要nums[0]),第一列的话如果nums[0]不是0,那么就1种组合法(不要nums[0]),如果nums[0]是0的话就会麻烦点,那么就2^1 = 2种组合法(不要nums[0],要nums[0]都行),第一列第二个如果也是0,就会有2^2 = 4种(不要nums[0],要nums[0],不要nums[1],要nums[1]都行),所以有多少个0,就有2多少次方个方法。
    4.遍历顺序:上下左右,左右上下都行。
    5.举例推导dp数组

Java代码如下:

//二维数组
class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum = 0;
        for(int num : nums) {
            sum += num;
        }
        if((sum + target) % 2 != 0) return 0;
        if(Math.abs(target) > sum) return 0;
        int bagSize = (sum + target) / 2;

        int[][] dp = new int[nums.length][bagSize + 1];
        int zeroN = 0;
        
        if(nums[0] <= bagSize) dp[0][nums[0]] = 1;
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] == 0) {
                zeroN++;
            }
            dp[i][0] = (int) Math.pow(2, zeroN);
        }

        for(int i = 1; i < nums.length; i++) {
            for(int j = 1; j <= bagSize; j++) {
                if(j >= nums[i]) {
                    dp[i][j] = dp[i - 1][j] + dp[i - 1][j -nums[i]];
                }else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }
        return dp[nums.length - 1][bagSize];
    }
}
//一维数组
class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum = 0;
        for(int num : nums) {
            sum += num;
        }
        if((sum + target) % 2 != 0) return 0;
        if(Math.abs(target) > sum) return 0;
        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];
    }
}

总结:一维数组的形式初始化只需要dp[0] = 1就行了,想象下nums[0]为0时,j = 0时递推公式dp[j] += dp[j -nums[i]];依旧可以用,此时相当于dp[0]+dp[0] = 2了。

474.一和零
题目链接:474.一和零
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰一和零
日期:2024-10-10

Java代码如下:

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        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];
    }
}

标签:target,nums,int,1049,随想录,II,bagSize,sum,dp
From: https://www.cnblogs.com/wowoioo/p/18457438

相关文章

  • 代码随想录算法训练营day11|150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K
    学习资料:https://programmercarl.com/0150.逆波兰表达式求值.html#算法公开课栈、队列、堆学习记录:150.逆波兰表达式求值(中序表达式转换为后序表达式,用栈实现;遇到符号就从栈中取前两个元素进行运算,再放回去)点击查看代码fromoperatorimportadd,sub,muldefdiv(x,y):......
  • LaTeX 教學系列 (III):基本設定
    LaTeX教學系列(II):第一份LaTeX文件裡面,我們提到了如何建立第一份文件,並且根據不同的文件類別使用章節標題。文章目錄TeX世界的巴別塔LaTeX的裝備:套件買裝備:安裝與使用套件說明書:CTANLaTeX百變怪:設定文字設定字體大小設定字體系列設定字型設定中文LaTeX的服裝:......
  • LaTeX 教學系列 (II):第一份 LaTeX 文件
    在上一篇文章LaTeX教學系列(I):LaTeX簡介中,提到了如何選擇編譯器與編輯器,以及一些LaTeX的基本操作,包含下指令、註解某段指令、開啟環境與章節深度設定。文章目錄LaTeX文件的工廠:文件環境設定資料夾的設定如何快速做品管:資料夾樹狀結構實際操作文件類別設定關於縮......
  • ANSI 与 ASCII 的区别,编码老问题
    ANSI与ASCII的区别ANSI与ASCII在字符编码领域有着显著的区别,以下是对这两者的详细比较:ASCII全称与定义:ASCII全称AmericanStandardCodeforInformationInterchange,即美国信息交换标准代码。它是一种标准的单字节字符编码方案,主要用于显示现代英语和其他西欧语言。编码......
  • 专为工程地质领域安全监测而设计,BWII型广播预警遥测系统助您实现全面监测!
    专为工程地质领域安全监测而设计,BWII型广播预警遥测系统助您实现全面监测!BWII型广播预警遥测系统是一款新型的雨量预警监测仪,具备多通道和多类型传感器接入功能。该系统能够定时采集和发送电压、电流、数字和脉冲等信息,同时结合事件驱动的工作方式,以高频传感扫描和定时采发签到......
  • iis网站数据库失败怎么解决
    解决IIS网站数据库连接失败的问题通常需要从以下几个方面进行排查和处理:检查数据库服务器状态:确认数据库服务是否正常运行。检查数据库服务器是否有足够的资源(如内存、磁盘空间)。验证数据库连接字符串:确保在Web.config或appsettings.json中的数据库连接字符串正确无误......
  • iis网站怎么连接数据库连接
    在IIS上部署的应用程序连接数据库通常涉及以下几个步骤:配置数据库连接字符串:在Web应用程序中,你需要定义一个连接字符串来指定如何连接到数据库。这个连接字符串通常包含数据库服务器地址、端口、数据库名称、用户名和密码等信息。例如,在ASP.NET应用中,可以在web.config文件......
  • QT中vtk读取nii文件并修改其中标签
    //获取读取器的输出数据vtkSmartPointer<vtkNIFTIImageReader>reader=vtkSmartPointer<vtkNIFTIImageReader>::New();//设置读取器的输入文件名constchar*initNiiName="D:/initInput.nii";reader->SetFileName(initNiiName);//读取NII图像数据try{ reader-&......
  • Java项目实战II基于Java+Spring Boot+MySQL的墙绘产品展示交易平台设计与实现(源码+数
    目录一、前言二、技术介绍三、系统实现四、文档参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言在当今多元化、个性化的家居装饰市场中,墙......
  • Java项目实战II基于Java+Spring Boot+MySQL的作业管理系统设计与实现(源码+数据库+文
    目录一、前言二、技术介绍三、系统实现四、文档参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言在教育信息化的大背景下,作业管理作为教学......