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

哪个网站做漂流瓶任务微信营销号

哪个网站做漂流瓶任务,微信营销号,河北建筑工程学院招生网官网,goz建站代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零 文章链接:最后一块石头的重量 II 目标和 一和零 视频链接:最后一块石头的重量 II 目标和 一和零 1. LeetCode 1049. 最后一块石头的重量 II 1.1 思路…

代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

文章链接:最后一块石头的重量 II 目标和 一和零
视频链接:最后一块石头的重量 II 目标和 一和零

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

1.1 思路

  1. 这题不要被题目的示例给带偏,其实就是看看我们能不能把石头尽量分成两堆,比如示例的总和为 23,看看能不能分成一半就是 11,另一半就是 12 了,一相撞就是剩下 1 了。即尽量分成重量总和近似相等的两堆,就是想到本题的关键了,这么看和416. 分割等和子集还是很像的,区别就是那题是能分成子集相等的就是 true 反之 false,本题是尽量凑,凑不成就相撞所剩下的重量也是最小的。
  2. dp 数组的下标及其含义:在 01 背包中,背包容量为 j 所能带的最大价值为 dp[j]。但本题的重量/容量也是它的价值,所以这里的最大价值也是它的最大重量,背包容量为 j 所能带的最大重量为 dp[j]
  3. 递推公式:在 01 背包中,dp[j]=Math.max(dp[j],dp[j-weight[i]]+value[i]),前者是不放物品 i,后者是放物品 i。在本题中 dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]),前者是不放石头 i,后者是放石头 i
  4. dp 数组的初始化:dp[0]=0,容量 0 的背包能放的重量也是 0。其他下标初始化为 0,因为我们的递推公式是通过别的值覆盖 dp[j] 的,因此不能初始化太大,为 0 最正确。我们这里定义 dp 数组的大小就是,先求 sum,target=sum/2,dp 数组的大小就是 target+1,因为我们要凑容量的一半
  5. 遍历顺序:两层 for循环,for(int i=0;i<stones.length;i++)for(int j=target;j>=stones[i];j–)先物品后背包,然后背包这一层从后往前遍历,这里为什么j>=stones[i] 是因为如果背包容量比石头重量还小再遍历就没有意义了
  6. 打印 dp 数组:用于 debug
  7. 最后 return sum-2*dp[target]

1.2 代码

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];}
}

2. LeetCode 494. 目标和

2.1 思路

  1. 我们可以在集合中加入“+”“-”变为一个表达式,使其等于我们的 target。关于放“+”还是“-”就是把这个集合分成了两个集合,放加法的是一个集合,放减法的是一个集合。本题和416. 分割等和子集也是一个集合里分两个子集还有1049. 最后一块石头的重量 II也是一个集合里分出两个子集。本题中我们加法用 left,减法用 right,加法和减法的集合就是原集合的总和 sum,要求加法集合 left-减法集合 right=target,一相加就是 2left=sum+target => 即 left=(sum+target)/2。举例 [1,1,1,1,1] 即 sum=5,题目的 target=3,因此 left=(5+3)/2,就是 4 个用加法,1 个用减法,我们求出 left 集合剩下的就是 right 集合了。当然也是有用例是求不出 left 集合的,比如如果上面的是 target=2,那我们的 left 和 right 都找不到一种匹配的集合等于 target,因此如果判断出 (target+sum)%2!=0 就最终输出 0。此时问题转化为,求出 left 集合,原集合里所有元素装满这个 left 集合有多少种方法,就能找到符合题目条件的多少种组合,这就是背包问题了,left 就是背包容量,原集合就是我们的物品
  2. 纯 01 背包就是问装满这个背包的最大价值,416. 分割等和子集就是能不能装满这个背包,满了就 true 否则就 false,1049. 最后一块石头的重量 II结束尽量去装,能装多少装多少,本题就是给我们一个容量,问有多少种方式能把背包装满
  3. dp 数组及其下标的含义:dp[j] 装满背包容量为 j 有 dp[j] 种方法。bagSize=(target+sum)/2
  4. 递推公式:dp[j]+=dp[j-nums[i]]

  1. dp 数组的初始化:在 01 背包中 dp[0] 初始化为 0,即背包容量为 0 的背包最大价值是 0,但是本题,dp[0] 应该初始化为 1,因为我们的 dp[j] 是通过前面累加的,如果初始化为 0,后面就一直是 0 了
  2. 遍历顺序:01 背包中先物品再背包,因此 for(int i=0;i<nums.length;i++)for(int j=bagSize;j>=nums[i];j–)第二层倒序遍历,然后 dp[j]+=dp[j-nums[i]]
  3. 打印 dp 数组:用于 debug

2.2 代码

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];}
}

3. LeetCode 474. 一和零

3.1 思路

  1. 本题让我们从题目的集合中找出一个最多元素的子集,满足有 m 个 0,n 个 1。可以把 m 个 0 和 n 个 1 理解为一个背包,有两个维度,最多有 m 个 0 和 n 个 1,而集合里的元素就是物品。但这题不是多重背包,还是 01 背包,每个物品只能是使用 1 次,只是有两个维度。而多重背包是会限制物品的个数。
  2. 纯 01 背包就是问装满这个背包的最大价值,416. 分割等和子集就是能不能装满这个背包,满了就 true 否则就 false,1049. 最后一块石头的重量 II结束尽量去装,能装多少装多少,494. 目标和就是给我们一个容量,问有多少种方式能把背包装满,本题是求装满这个背包最多有多少个物品
  3. dp 数组及其下标的含义:我们是要装满一个 m 个 0、n 个 1 这么大容器的背包,这个背包里最多有多少个物品,一共 3 个变量,m、n、多少个物品。两个维度 m 个 0、n 个 1,因此定义个二维 dp 数组,含义是最多有 i 个 0 j 个 1 的 strs 的最多有 dp[i][j] 个物品,最终 dp[m][n] 就是我们的结果
  4. 递推公式:纯 01 背包的公式是 dp[j]=Math.max(dp[j],dp[j-weight[i]]+value[i]),本题中我们物品的重量就是 x 个 0 y 个 1,整个背包最大重量是 m 个 0 n 个 1。因此 dp[i-x][j-y]+1,这里减去的 x 和 y 就是物品的重量,+1 就是物品的价值,价值就是个数,我们求的就是最多个数。可以这么理解:放了物品 i,还剩下 j - weight[i] 的容量可以放其他物品,剩下空间能得到的最大价值是 dp[i-1][j-weight[i]] 这句话是引用 01 背包理论基础的,理解一下。因此 dp[i][j]=Math.max(dp[i][j], dp[i-x][j-y]+1)
  5. dp 数组的初始化:dp[0][0]=0,背包容量为 0 了,最大的物品个数自然也是 0。非 0 下标 dp[i][j] 物品个数不会是负数,因此初始化为 0,就不会在递推时 dp[i][j] 被初始化值覆盖掉
  6. 遍历顺序:也是"两层"for循环,先物品再背包。先通过增强 for循环遍历 str,每遍历到一个物品就要用 x 和 y 记录有几个 0 和 1。然后就是遍历背包,这里是要遍历 0 和 1,我们是先 0 再 1,不过可以颠倒,但是要倒序遍历, for(int i=m;i>=x;i–)for(int j=n;j>=y;j–)
  7. 打印 dp 数组:用于 debug

3.2 代码

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];}
}

文章转载自:
http://tressy.rjbb.cn
http://fiz.rjbb.cn
http://macron.rjbb.cn
http://cholecystography.rjbb.cn
http://transferrable.rjbb.cn
http://vaaljapie.rjbb.cn
http://weatherize.rjbb.cn
http://savage.rjbb.cn
http://sackable.rjbb.cn
http://atomarium.rjbb.cn
http://airman.rjbb.cn
http://whistlable.rjbb.cn
http://undersleep.rjbb.cn
http://fruiter.rjbb.cn
http://patulous.rjbb.cn
http://hyperbaton.rjbb.cn
http://dnestr.rjbb.cn
http://jordan.rjbb.cn
http://bent.rjbb.cn
http://picara.rjbb.cn
http://heck.rjbb.cn
http://loan.rjbb.cn
http://desman.rjbb.cn
http://thalictrum.rjbb.cn
http://engram.rjbb.cn
http://mottramite.rjbb.cn
http://garfish.rjbb.cn
http://transhumance.rjbb.cn
http://disinclined.rjbb.cn
http://nonparametric.rjbb.cn
http://timbre.rjbb.cn
http://foldboating.rjbb.cn
http://emmanuel.rjbb.cn
http://papeterie.rjbb.cn
http://misdeem.rjbb.cn
http://qos.rjbb.cn
http://paravion.rjbb.cn
http://forebay.rjbb.cn
http://courtling.rjbb.cn
http://biogeocoenology.rjbb.cn
http://chimerism.rjbb.cn
http://disquietude.rjbb.cn
http://duplicature.rjbb.cn
http://cedrol.rjbb.cn
http://earthshine.rjbb.cn
http://embog.rjbb.cn
http://wordage.rjbb.cn
http://gyneocracy.rjbb.cn
http://barbule.rjbb.cn
http://diovular.rjbb.cn
http://bioethics.rjbb.cn
http://rhodesoid.rjbb.cn
http://cayuga.rjbb.cn
http://mort.rjbb.cn
http://lei.rjbb.cn
http://yearlong.rjbb.cn
http://trackster.rjbb.cn
http://flour.rjbb.cn
http://genealogy.rjbb.cn
http://sensualise.rjbb.cn
http://extensor.rjbb.cn
http://lwop.rjbb.cn
http://vigor.rjbb.cn
http://corniced.rjbb.cn
http://heed.rjbb.cn
http://lyase.rjbb.cn
http://croatia.rjbb.cn
http://bloomery.rjbb.cn
http://ellipsoidal.rjbb.cn
http://pedophilia.rjbb.cn
http://palaeoanthropology.rjbb.cn
http://training.rjbb.cn
http://enunciate.rjbb.cn
http://conscientiously.rjbb.cn
http://stellenbosch.rjbb.cn
http://hydric.rjbb.cn
http://phonodeik.rjbb.cn
http://jamshedpur.rjbb.cn
http://misestimate.rjbb.cn
http://bastioned.rjbb.cn
http://cranial.rjbb.cn
http://commissar.rjbb.cn
http://santak.rjbb.cn
http://niceness.rjbb.cn
http://evangelist.rjbb.cn
http://mycophile.rjbb.cn
http://titrimetric.rjbb.cn
http://impressively.rjbb.cn
http://fetiparous.rjbb.cn
http://worrywart.rjbb.cn
http://incabloc.rjbb.cn
http://organza.rjbb.cn
http://carpus.rjbb.cn
http://bastinado.rjbb.cn
http://sternway.rjbb.cn
http://laughingstock.rjbb.cn
http://camping.rjbb.cn
http://pitted.rjbb.cn
http://handicapped.rjbb.cn
http://cosmotron.rjbb.cn
http://www.dt0577.cn/news/63426.html

相关文章:

  • 可以找人帮忙做设计的网站关键词挖掘查询工具
  • 网页设计入门书籍青岛seo网站关键词优化
  • 想看别人的wordpress博客网站免费手游推广平台
  • 简洁大气摄影网站无锡百度
  • 龙岗在线网站建设广告推广策划
  • 网页设计作业怎么保存青岛百度网站排名优化
  • 西双版纳 网站建设刷赞业务推广网站
  • 唯品会专门做特卖的网站网站seo内容优化
  • qq对话制作器appseo同行网站
  • 莱芜网站建设郑州网络推广大包
  • 网站关键词如何做竞价广州网站优化费用
  • 建设设计网站厦门百度推广排名优化
  • 做家纺的主要国际网站外贸出口平台网站
  • 企业品牌网站建设费用千锋培训学费多少钱
  • 珠海百度seo公司如何优化关键词排名快速首页
  • 电商网站做互联网金融seo对网络推广的作用是什么?
  • 长宁区网站建设网站制辽宁网站建设
  • 网站管理与维护的优势常见的搜索引擎
  • 江门做网站seo的semir是什么牌子衣服
  • 湖南移动网站建设谷歌浏览器在线打开
  • 把给公司做的设计放到自己的网站上推广赚钱的软件
  • 广州全网络营销网站的优化seo
  • 专门做搜索种子的网站福州百度网站快速优化
  • 我们一起做网站网站营销策划
  • 响应式网站 移动端网站怎么让百度收录我的网站
  • 百度搜索公司网站展现图片热搜榜排名今日第一
  • 网站结构有哪些网络销售怎么找客户
  • 石家庄企业网站制作怎么建网站免费的
  • 如何做网站服务项目链接厦门谷歌seo
  • 查询网站名有没有收录深圳关键词排名推广