代碼隨想錄算法訓練營|第四十五天|1049. 最后一块石头的重量 II、494. 目标和、474.一和零。刷题心得(c++)

目录

讀題

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

自己看到题目的第一想法

看完代码随想录之后的想法

494. 目标和

自己看到题目的第一想法

看完代码随想录之后的想法

474.一和零

自己看到题目的第一想法

看完代码随想录之后的想法

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

思路

Code

494. 目标和 - 實作

思路

Code

474.一和零 - 實作

思路

Code

總結

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

相關資料


讀題

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

自己看到题目的第一想法

初始化定義,可以改成dp[j]代表重量為j 的狀態下,最小的數值為dp[j],如果跟等和子集很像,那我的最大的背包重量應該是stone sum,但想了一陣子還是沒有想法,思緒非常不清晰。

看完代码随想录之后的想法

重量總和近似的兩堆,聽完就醍醐灌頂了,程式一下子就寫出來了,的去跟昨天的416很像,但是真的沒有想到是氛圍重量總和近似的兩堆,基本上有做過416,這一題就聽到這個關鍵字,基本就可以解出來了

494. 目标和

自己看到题目的第一想法

正與負可以想成取與不取,根據卡哥的遞推公式,還是沒有想得很清晰,到底可以怎麼做。

看完代码随想录之后的想法

  • 拆解問題

將這個數組分成兩個子集,加法放一個集合(left)、減法放一個集合(right)

考慮’+’ 與 ‘-’ 的狀況下,公式如下

left + ( -right) = target → target 是題目提供的

left - right = target

不考慮’+’ 與 ‘-’ 的狀況下,公式如下

left + right = sum

這個等式可以改為

right = sum - left

將left 帶入考慮 ‘+’ & ‘-’的公式可以得到

left + left - sum = target

2 left = target + sum

left = (target + sum) / 2

因為target 跟 sum都是固定的

target 由題目提供

sum 透過數組總和得出

所以透過這兩個參數可以得出left這個變量需要為多少

  • 轉換問題為01背包問題

在個問題題當中

正數總和 - 負數總和 = target 也就是 left - right = target

經過重新定義等式,可以得到上面所得出的公式

left = (target + sum) / 2

而left 實際上代表選擇的正數總和

所以問題轉化成: 如何從數組中選擇一些數字,使其總和為left

並且根據公式,可以發現target + sum / 2 是有可能不是正整數的

比如說target + sum = 5 那最後得到的left數字是 2.5

但我們在這個數組當中只有正整數,無法得到一個集合內的數字為2.5,也就是說無法得到一個解法,此時這個數組並沒有解法。

延伸出來講,回到公式定義 正數總和 - 負數總和 = target

這裡得負數總和不能想像成left - ( - right) = target

而是left - right = target ,不然思緒會感覺到混亂,會想說負負得正

但實際上所謂的負數總和根據題意也是正整數相加後套上一個 '-' 號

那假設target > sum 也就是目標值大於數組總和(全部都是正的) 那也無法得出一個解,因為這件事情在這個題意當中無法達成。

474.一和零

自己看到题目的第一想法

不太清楚要怎麼處理這樣的題目,看得有點矇

看完代码随想录之后的想法

原本的背包有只有一個維度,這次的背包有兩個維度需要考慮,並且因為物品的重量維度也有兩個,所以在處理上比較複雜,可以想像成是一個二維的滾動數組,背包滾動的過程比較繁瑣,需要考慮。

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

思路

<aside> 💡 分為兩堆近似重量的,兩者相撞就會是最小的。

</aside>

  1. 定義DP數組以及下標的含意

    target: 假設分割為兩個的重量近似的兩堆

    dp[j] : 背包重量 j 的最大價值為dp[j]

    stones数組中,重量與價值就是stones[i]

  2. 遞推公式

    dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);

  3. 根據遞推公式,確定DP數組如何初始化

    dp[0]要初始化為0,其他部分也要更新為正整數下的最小位数0

  4. 確定遍歷順序

    避免覆蓋掉上一次的值,所以要使用倒敘遍歷

  5. 打印dp數組 (debug);

Code

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum = 0;for(int i = 0; i < stones.size(); i++) {sum += stones[i];}int other = sum;sum /= 2;vector<int> dp(sum + 1, 0);for(int i = 0; i < stones.size(); i++) {for(int j = sum; j >= stones[i]; j--) {dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);}}int result = other - (dp[sum] + dp[sum]);return result;}
};

 

494. 目标和 - 實作

思路

<aside> 💡 之前的題目是求容量為j的背包,最多能裝多少。 這次的題目是求容量為j的背包,有多少方法可以裝滿。

</aside>

  1. 定義DP數組以及下標的含意

    dp[j]: 容量為j的背包,有dp[j]個方法可以裝滿。

    dp[i][j]: 使用下標[0,i]個物品,在容量j的背包,有dp[i][j]種方法可以裝滿

  2. 遞推公式

    其實轉換一下思路可以知道,之前求最大價值時,會去透過dp[j - weight[i]] + value[i] 的方法透過dp[j - weight[i]] 知道不包含目前重量的最大價值為多少

    那目標和dp[j - nums[i]] 可以背包j在不包含當前的nums[i]數值,有多少種方法可以裝滿 → dp[j - nums[i]]

    以及背包在包含當前nums[i]的數值,有多少種方法 → dp[j]

    公式會長成 dp[j] = dp[j] + dp[j - nums[i]]

    根據C++語法可以簡化為

    dp[j] += dp[j - nums[i]]

  3. 根據遞推公式,確定DP數組如何初始化

    因為我們的問題轉化了,所以是要找出nums中有多少子集它的和為正數總和,所以我們就不能用原題意來看這道題目

    dp[0] 代表組成正數總和為0的方法有多少種,不選擇任何數字或者選取相互抵銷的正數或負數,但在初始化的過程當中並沒有選取任何數,可以想成說

    <aside> 💡 在不取任何數的狀況下,來思考有多少方法可以匹配dp數組的定義

    </aside>

    根據上面這個思路

    假設背包大小為三,其初始化數組應該如下

    dp[0] = 1

    dp[1] = 0

    dp[2] = 0

    因為不取任何數的狀況下,達成dp[0]的方法有1種,dp[1]~dp[2] 因為根本沒有取任何數,所以只有0種方法可以達成。

  4. 確定遍歷順序

    根據遞推公式,外層迴圈是for 物品的變化取與不取,內層迴圈則是for 背包重量的變化由大到小進行遍歷。

  5. 打印dp數組 (debug);

输入:nums: [1, 1, 1, 1, 1], S: 3

bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4

dp数组状态变化如下:

Code

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum = 0;for(int i = 0; i < nums.size(); i++) {sum += nums[i];}if(abs(target) > sum) return 0;if((target + sum) % 2 == 1) return 0;int bagsize = (sum + target) / 2;vector<int> dp(bagsize + 1, 0);dp[0] = 1;for(int i = 0; i < nums.size(); i++ ) { //選擇物品for(int j = bagsize; j >= nums[i]; j--) { //選擇背包dp[j] += dp[j - nums[i]];}}return dp[bagsize];}
};

 

474.一和零 - 實作

思路

<aside> 💡 題意中的m與n可以想像成是兩個維度的背包,物品也可以想成是有兩個維度的重量所組成

</aside>

  1. 定義DP數組以及下標的含意

    dp[i][j]: i個0與j個1所組成的最大子集合為dp[i][j]

  2. 遞推公式

    • 先處理物品重量
      • 每個字串由0跟1組成,計算其0,1的個別重量為zeroNum、oneNum
    • 遞推公式 dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1]
  3. 根據遞推公式,確定DP數組如何初始化

    dp[0][0] = 0 代表沒有組合可以放入這個背包當中,其餘數組則初始化為0 避免影響結果

  4. 確定遍歷順序

    先遍歷物品,在遍歷二維背包

    因為是滾動數組,所以二維背包是由後往前遍歷

Code

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp (m+1, vector<int>(n+1, 0));for(string str: strs) {int zeroNum=0, oneNum=0;for(char c: str) {if(c == '0') zeroNum++;else oneNum++;}for(int i = m; i >= zeroNum; i--) {for(int j = n; j >= oneNum; j--) {dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}}}return dp[m][n];}
};

總結

自己实现过程中遇到哪些困难

在實現的過程中,在494. 目标和,其實真的思考了很久到底要怎麼解,並且題解影片也看了好幾次,也透過了線上AI,不斷的去釐清自己的想法,最終才寫了出來,感覺這個過程中其實真的不容易,理解上要花很多時間才能夠完全吸收,但目前就是一刷,繼續加油!

今日收获,记录一下自己的学习时长

總共學習了4hr左右,不斷的去釐清自己的想法,最終終於釐清並且透過自己的語言寫下思路。

相關資料

● 今日学习的文章链接和视频链接

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

视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili

https://programmercarl.com/1049.最后一块石头的重量II.html

494. 目标和

视频讲解:动态规划之背包问题,装满背包有多少种方法?| LeetCode:494.目标和_哔哩哔哩_bilibili

https://programmercarl.com/0494.目标和.html

474.一和零

视频讲解:动态规划之背包问题,装满这个背包最多用多少个物品?| LeetCode:474.一和零_哔哩哔哩_bilibili

https://programmercarl.com/0474.一和零.html

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/170340.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6. Cesium中的Entity

1. Entity类简介 Entity类是Cesium中描述和呈现地球上实体对象的核心类。它具有丰富的属性和方法&#xff0c;用于控制和定制地理实体的外观和行为。Entity对象可以表示各种地理实体&#xff0c;如点、线、面等&#xff0c;并具有位置、方向、模型、标牌、折线、多边形等属性&…

利用Jpom在线构建Spring Boot项目

1 简介 前面介绍了运用Jpom构建部署Vue项目&#xff0c;最近研究了怎么部署Spring Boot项目&#xff0c;至此&#xff0c;一套简单的前后端项目就搞定了。 2 基本步骤 因为就是一个简单的自研测试项目&#xff0c;所以构建没有使用docker容器&#xff0c;直接用java -jar命令…

【Axure高保真原型】图片手电筒效果

今天和大家分享图片手电筒效果的原型模板&#xff0c;鼠标移入图片区域后&#xff0c;会显示一个光圈&#xff0c;光圈会跟随鼠标移动&#xff0c;照亮对应的区域&#xff1b;鼠标拖动时可以移动地图图片&#xff0c;查看更多区域的内容&#xff0c;具体效果可以打开下方原型地…

app开发者提升第四季度广告收入的方法

第四季度将迎来双十一、双十二、圣诞、元旦为主的电商购物季&#xff0c;这是一年中利用线上消费为全新年度和全新预算做好准备的最佳时机&#xff0c;从过往的变现成功案例中汇总了优化要点&#xff0c;帮助开发者在第四季度和未来一年获取更多广告收益。 https://www.shensh…

OceanBase 全局索引与局部索引探索

OceanBase 全局索引与局部索引探索导致的本区域查找和跨区域查找。 作者&#xff1a;网名大数据模型&#xff0c;对制造业、银行业、通讯业了解多一点&#xff0c;关心专注国产数据库技术布道以及数据资产建设的应用实践。 爱可生开源社区出品&#xff0c;原创内容未经授权不得…

AUTOSAR开发相关的常用缩写

每次看见一个缩写都想不起来它的全称是什么&#xff0c;去搜发现好多还不对&#xff0c;刚好最近看的一个文档里面还挺多的&#xff0c;也比较全&#xff0c;就记录一下吧。 以后要是有新增的也会收集到这里的。

智能振弦传感器:参数智能识别技术的重要科技创新

智能振弦传感器&#xff1a;参数智能识别技术的重要科技创新 智能振弦传感器是一种能够自动识别传感器参数的高科技产品。它的研发得益于河北稳控科技的不断创新和努力&#xff0c;其电子标签专用读数模块模块TR01将传感器生产和标定过程实现了自动化。该模块将温度电阻两芯线…

(四)Apache log4net™ 手册 - AOP

0、引言 如果你已经开发了一个中型或者大型的 .NET / .NET Framework 项目但还没有为其添加日志系统。那么&#xff0c;你可能需要重新回顾大量的业务逻辑代码&#xff0c;并在其中找到合适的位置&#xff0c;编写合适的日志输出语句进行插入&#x1f641;。 显然&#xff0c…

C语言 sizeof 函数内部进行计算

直接看代码 #include <stdio.h> int main() {int i 2;int j;j sizeof(i i);printf("i %d, j %d", i ,j);return 0; }执行结果&#xff1a; 可以看到 i的值一直是没有变的&#xff0c; j 是int类型下 sizeof占用的大小为 4个字节&#xff0c;不是i的 22…

#电子电器架构 —— 车载网关初入门

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数7000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他…

php 数组基础/练习

数组 练习在最后 数组概述 概述与定义 数组中存储键值对 数组实际上是一个有序映射 key-value&#xff0c;可将其当成真正的数组、列表&#xff08;向量&#xff09;、散列表、字典、集合、栈、队列等 数组中的元素可以是任意类型的数据对象&#xff08;可以嵌套数组&#…

计算机网络_03_tcp/ip四层模型

文章目录 1.为什么会有tcp/ip?2.tcp/ip是什么?3.为什么会有tcp/ip四层模型?4.tcp/ip四层模型介绍 1.为什么会有tcp/ip? 早期的计算机(计算机网络没有出现之前)几乎都是各自为战, 各种操作系统厂家百花齐放, 市面上的大部分计算机使用的都是不同的操作系统, 为每个人提供定…

GoLong的学习之路(七)语法之slice(切片)

书接上回&#xff0c;上回书中写道&#xff1a;指针&#xff0c;并说明了基本引用类型分配内存new和特定情况下slice&#xff08;切片&#xff09;&#xff0c;map&#xff0c;channel等集合函数的内存分配make。这篇文章就开始说明&#xff0c;slice。 文章目录 slice&#xf…

ACM练习C++知识点笔记

1、字符和数字的转换 #include<iostream> using namespace std; int main(){int n 8 - 48;cout<<n<<endl;return 0; } 数字转字符串 #include <string> #include <sstream> #include <iostream> using namespace std; int main() {doubl…

MySQL2:MySQL中一条查询SQL是如何执行的?

MySQL2&#xff1a;MySQL中一条查询SQL是如何执行的&#xff1f; MySQL中一条查询SQL是如何执行的&#xff1f;1.连接怎么查看MySQL当前有多少个连接&#xff1f;思考&#xff1a;为什么连接数是查看线程&#xff1f;客户端的连接和服务端的线程有什么关系&#xff1f;MySQL参数…

Zabbix出现 404Not FoundThe requested URL /zabbix was not found on this server.

目录 一、问题&#xff1a; 二、原因&#xff1a; 三、解决方法&#xff1a; 一、问题&#xff1a; Not Found The requested URL /zabbix was not found on this server. 二、原因&#xff1a; 未找到 在此服务器上找不到请求的 URL /zabbix。 /etc/httpd/conf.d 目录…

Flutter笔记:图片的 precacheImage 函数

Flutter笔记 图片的 precacheImage 函数 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134004572 【简…

【谢希尔 计算机网络】第4章 网络层

目录 网络层 网络层的几个重要概念 网络层提供的两种服务 网络层的两个层面 网际协议 IP 虚拟互连网络 IP 地址 IP 地址与 MAC 地址 地址解析协议 ARP IP 数据报的格式 IP 层转发分组的过程 基于终点的转发 最长前缀匹配 使用二叉线索查找转发 网际控制报文协议…

【Docker】联合探讨Docker:容器化技术的革命性应用

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

【021】整理力学拉伸实验数据(复制、黏贴、计算)_#VBA

整理力学拉伸实验数据 1. 需求2. 实现流程2.1 流程图2.2 运行方法2.3 完整代码 1. 需求 2. 实现流程 2.1 流程图 流程如上&#xff0c;因测试得到多个数据表格&#xff0c;先将表格数据合并&#xff0c;并以文件名作为每个数据的代号。然后更换坐标轴&#xff0c;通过对文件名…