当前位置: 首页 > news >正文

java算法day43 | 动态规划part05 ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

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

在这里插入图片描述
在这里插入图片描述
核心思想: 尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。
是不是感觉和昨天讲解的416. 分割等和子集 (opens new window)非常像了。那么分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。

class Solution {public int lastStoneWeightII(int[] stones) {int sum=0;for(int i=0;i<stones.length;i++){sum+=stones[i];}int target=sum/2;int dp[]=new int[target+1];//1、定义dp数组 3、第一列初始化为0for(int i=0;i<stones.length;i++){for(int j=target;j>=stones[i];j--){//4、遍历顺序dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]);//2.递推公式}}return sum-dp[target]-dp[target];//最终的返回结果}
}

时间复杂度:O(m × n) , m是石头总重量(准确的说是总重量的一半),n为石头块数
空间复杂度:O(m)

494. 目标和

在这里插入图片描述
在这里插入图片描述

思路: 这道题的dp数组的含义变了。具体看代码随想录的讲解

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)/2为整数的条件或target的绝对值大于sum的绝对值,直接返回0if((target+sum)%2!=0 || Math.abs(target)>Math.abs(sum)) return 0;int size=(target+sum)/2;int[] dp=new int[size+1];//1、定义dp数组,表示j容量时的表达式数目dp[0]=1;//3、初始化for(int i=0;i<nums.length;i++){for(int j=size;j>=nums[i];j--){//4、因为是01背包,所以反向遍历dp[j]=dp[j]+dp[j-nums[i]];//2、递推公式}}return dp[size];}
}

时间复杂度:O(n × m),n为正数个数,m为背包容量
空间复杂度:O(m),m为背包容量

474.一和零

在这里插入图片描述
思路: 这道题是一个二维的背包问题,和普通的背包相比只需要多一层对容量的循环。
在这里插入图片描述

class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][] dp=new int[m+1][n+1];//1、定义dp数组,表示当0的容量为x,1的容量为n时,最大子集的长度for(int i=0;i<strs.length;i++){//4、遍历顺序,物品正序遍历int weightm=0;int weightn=0;for(int j=0;j<strs[i].length();j++){if(strs[i].charAt(j)=='0') weightm++; else weightn++;}for(int x=m;x>=weightm;x--){//4、物品的空间占用逆序遍历for(int y=n;y>=weightn;y--){dp[x][y]=Math.max(dp[x][y],dp[x-weightm][y-weightn]+1);//2、递推公式,注意value是1}}}return dp[m][n];}
}

时间复杂度: O(kmn),k 为strs的长度
空间复杂度: O(mn)

http://www.lryc.cn/news/334764.html

相关文章:

  • STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)
  • 工地安全监测识别摄像机
  • 【零基础学数据结构】顺序表实现书籍存储
  • 【智能算法】黑寡妇优化算法(BWO)原理及实现
  • C#-非托管代码
  • 计算机视觉之三维重建(7)---多视图几何(下)
  • AUTOSAR配置工具开发教程 - 开篇
  • 配置VM开机自启动
  • 工作的第四天
  • 前端开发语言概览:从HTML、CSS到JavaScript
  • 《Java面试自救指南》(专题二)计算机网络
  • Android14音频进阶之<进阶调试>:Perfetto定位系统音频问题(六十六)
  • 使用 Clickhouse 集成的表引擎同步数据方式详解
  • Linux 性能分析工具大全
  • FME学习之旅---day21
  • volta(轻松切换管理Node.js版本)
  • 机器学习知识点
  • SQL注入利用学习-Union联合注入
  • zookeeper源码(12)命令行客户端
  • 深度学习的数学基础--Homework2
  • 什么是HW,企业如何进行HW保障?
  • 【Redis系列】Spring Boot 集成 Redis 实现缓存功能
  • Flutter之Flex组件布局
  • 【Linux】TCP编程{socket/listen/accept/telnet/connect/send}
  • 【WPF应用33】WPF基本控件-TabControl的详解与示例
  • [C语言]——动态内存管理
  • C++ 学习笔记
  • 本科生学深度学习一残差网络,解决梯度消失和爆炸
  • 初识SpringMVC
  • 【Leetcode】2009. 使数组连续的最少操作数