【力扣刷题 | 第二十四天】

这篇具有很好参考价值的文章主要介绍了【力扣刷题 | 第二十四天】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【力扣刷题 | 第二十四天】,【力扣刷题】,leetcode,算法,职场和发展

目录

前言:

1049. 最后一块石头的重量 II - 力扣(LeetCode)

494. 目标和 - 力扣(LeetCode)

总结:


前言:

                 今天我们依然暴打动态规划

1049. 最后一块石头的重量 II - 力扣(LeetCode)

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

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

如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。

【力扣刷题 | 第二十四天】,【力扣刷题】,leetcode,算法,职场和发展

这个问题其实很好想:我们如何把石头尽可能的撞碎呢?

很简单,我们在大体上把这些石头分成重量相似的两堆,因为如果两堆石头的重量相似,那么相撞后就一定会得到最小的值。

因此从动态分类的角度来讲,我们可以把这道题理解为是  一个重量为(sum/2)的背包,我们尽可能的装背包,之后装进背包的是一堆石头,未装进背包的是一堆石头,那么这两堆石头相减,就可以得到最小的石头重量。

那么我们就又把这道题转化为了 装与不装的01背包问题

其实这道题和我们前天做的分割等和子集是基本相同的,感兴趣的朋友可以去看一下那道题

那么既然是动态规划问题,我们就继续进行动态规划五部曲:

1.确定dp数组及其含义:dp[j]  是背包含量为j的时候所背的最大价值(在这里我们重量就是价值,价值就是重量)

2.递推公式  dp[j] = max(dp[j] , dp[ j - stones[i] ]+stones[i])

里层的减是减去容量,外面的加是加上价值,只不过是因为我们的重量和价值是一样的

3.确定初始化:全部初始化为0即可 

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
            int sum=0;
            vector<int>dp(1501,0);
        for(int a : stones)
        {
            sum=sum+a;
        }

        int target = sum/2;

        for(int i=0;i<stones.size();i++)
        {
            for(int j= target;j>=stones[i];j--)
            {
                 dp[j] = max(dp[j] , dp[ j - stones[i] ]+stones[i]);
            }
        }
        return sum-dp[target]-dp[target];
    }
};

 在这里我们要特别对末尾进行说明,为什么是   return sum-dp[target]-dp[target];

其实很好理解,因为这里的dp数组是一堆石头,而我们用sum-dp数组就得到了另外一堆石头的重量,再减一次dp数组,实际就是模拟两堆石头进行碰撞。

494. 目标和 - 力扣(LeetCode)

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

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

例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

【力扣刷题 | 第二十四天】,【力扣刷题】,leetcode,算法,职场和发展

这道题其实我们可以这样理解: 

一共有两个集合,两个集合分别装数字,设置目标值target,询问有几种可能使得两个集合相减的数字等于target

再优化一下:

我们可以把target也作为一个数字加到这两个集合的待选序列,询问有几种可能  使得两个集合的值相等

  再转化一下思维:

,而target只有一个,也就是只能永远出现在一侧,另外一侧始终没有target,那么我们始终求没有target的那一侧不就好了嘛,换句话说,不就是在给定集合里面寻找有多少个集合的值等于(sum+target)/2/

那么我们不就又把这道题转化为了背包问题嘛?只不过以前我们总是在求是否有一种方法能把背包装满,现在求的是有多少种方法把背包装满。

因此我们按照动态规划五部曲走:

1.确定dp数组的含义:dp[j] 表示填满容量为j的背包最多有dp[j]种方法,例如dp[2]是指填满容量为2的背包最多有dp[2]种方法。

2.确定递推公式:dp[j]+=dp[j-nums[i]];

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum=0;
        for(int a : nums)
        {
            sum=sum+a;
        }

        if((target + sum)%2==1) return 0;
        if(abs(target)>sum) return 0;
        else
        {
              int a = (target + sum) / 2;
              vector<int> dp(a + 1, 0);
             dp[0] = 1;
            for (int i = 0; i < nums.size(); i++) 
            {
               for (int j = a; j >= nums[i]; j--) 
               {
                dp[j] += dp[j - nums[i]];
                }
            }
        return dp[a];
        }
    }
};

总结:

        动态规划想清楚之后直接爆杀。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

【力扣刷题 | 第二十四天】,【力扣刷题】,leetcode,算法,职场和发展

 文章来源地址https://www.toymoban.com/news/detail-629793.html

到了这里,关于【力扣刷题 | 第二十四天】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第四十四天

    ●scoped 属性      HTML5 中的新属性(布尔属性)。如果使用该属性,则样式仅仅应用到 style 元素的父元素及其子元素。父组件的样式将不会渗透到子组件中。      实现组件的私有化,不对全局造成样式污染,表示当前style属性只属于当前模块。 ●CSS动画      动画允许元素

    2024年02月16日
    浏览(33)
  • 第四十四天打卡

    零钱兑换 II 中等 1K 相关企业 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号

    2024年02月03日
    浏览(39)
  • 学习Android的第十四天

    目录 Android DatePicker 日期选择器 DatePicker 属性 和 事件 DatePicker 事件 获得 DatePicker 的值 Android TimePicker 时间选择器 TimePicker 属性 TimePicker 事件 获得 TimePicker 的值 Android CalendarView 日历视图 CalendarView 属性 CalendarView 事件 获得 CalendarView 的值 在Android中,DatePicker是一个用户界面组件

    2024年02月21日
    浏览(37)
  • 算法练习第六十四天

    LCR 184. 设计自助结算系统 - 力扣(LeetCode) 总结:利用一个双端维护队列一个往后递减的队列,对头是最大值,每次进入一个新值时就一直和队尾元素比较将比新的值小的数排出,这样能保证留在队列中的数都是会对最大值产生影响的数,而当主队列中将要排出的数与双端队

    2024年02月07日
    浏览(43)
  • MFC补充第十四天 句柄嫁接与子类化

    句柄嫁接与子类化: a)Attach和Detach就是单纯的嫁接与分离函数。 对象一旦嫁接入一个句柄,就可以自由地调用CWnd或其派生类的功能。 b)子类化Subclass内部包含Attach,额外再增加一个消息转拨到派生类(SubClass就是子类) c)SubClassWindow函数内部核心功能就是Attach和::SetWindowLong

    2024年02月16日
    浏览(37)
  • leetcode 力扣刷题 旋转矩阵(循环过程边界控制)

    下面的题目的主要考察点都是,二维数组从左上角开始顺时针(或者逆时针)按圈遍历数组的过程。顺时针按圈遍历的过程如下: 对于每一圈,分为四条边 ,循环遍历就好。这时,对于 四个角 的元素的处理,可以将四条边的遍历分为以下两种情况: 第一种:每条边都从对

    2024年02月12日
    浏览(36)
  • 【leetcode 力扣刷题】汇总区间//合并区间//插入区间

    题目链接:228.汇总区间 题目内容: 看题目真是没懂这个题到底是要干啥……实际上题目要求的 恰好覆盖数组中所有数字 的 最小有序 区间范围列表,这个最小是指一个区间范围小。比如能够覆盖{2,3,4,6}的区间可以是[2,6],但是5在区间内,却不在数组内,因此这个区间不是最

    2024年02月10日
    浏览(29)
  • 十四天学会C++之第五天:类的详细讨论

    什么是友元函数和友元类,它们的作用。 如何声明和使用友元函数和友元类,访问类的私有成员。 友元函数(Friend Functions) 友元函数是一种特殊的函数,它被允许访问类的私有成员。这意味着即使成员是私有的,友元函数也能够直接访问它们,而不需要通过公有接口。这提

    2024年02月07日
    浏览(36)
  • 十四天学会C++之第一天(入门和基本语法)

    C++诞生于20世纪80年代初,它的创造者是计算机科学家Bjarne Stroustrup。当时,Stroustrup在贝尔实验室工作,他希望为C语言添加一些功能,以便更好地支持系统开发。这个愿望促使他创建了C++。 C++的名字来源于它的基因,其中的\\\"C\\\"代表了C语言,而\\\"++\\\"表示C语言的一个增强版本。这

    2024年02月07日
    浏览(41)
  • 蓝桥杯十四天冲刺班 第十四天《考场经验 | 历年考点 | 蓝桥杯押题》《C,JAVA,PY在蓝桥杯中必须要会用的容器 | 集合》(3K+字解析)

     📒博客首页:Sonesang的博客 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 ❤️ :热爱Java与算法学习,期待一起交流! 🙏作者水平很有限,如果发现错误,求告知,多谢! 🌺有问题可私信交流!!!   目录 算法 实力 = 知识点+刷题量+速度+灵活的大脑 C++组知识点 java组知识点

    2023年04月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包