leetcode hot100中的经典背包问题

news/2024/11/17 3:23:54/

通过对比完全背包和01背包的leetcode hot100中几个小题目,明确应用场景,以及代码书写的遍历顺序。

完全背包问题

完全背包指的是每件物品可以重复被使用,放入背包中。

322. 零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104
class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, amount + 1);dp[0] = 0;int n = coins.size();for (int i = 1; i <= amount; i++) {for (int j = 0; j < n; j++) {if (coins[j] <= i) {dp[i] = min(dp[i], dp[i - coins[j]] + 1);}}}if (dp[amount] > amount) return -1;return dp[amount];}
};

01背包问题

01背包指的是每件最多只能被使用一次,放入背包中。

416. 分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100
class Solution {
public:bool canPartition(vector<int>& nums) {int n = 20000;vector<bool> dp(n + 1, false);dp[0] = true;int sum = 0;for (int j = 0; j < nums.size(); j++) {sum += nums[j];for (int i = n; i >= 1; i--) {if (i >= nums[j] && dp[i - nums[j]]) {dp[i] = true;}}}if (sum & 1) return false;return dp[sum >> 1];}
};

完全背包-需要联想下

139. 单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。注意,你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • s 和 wordDict[i] 仅由小写英文字母组成
  • wordDict 中的所有字符串 互不相同

这个题目需要把词典的每个单词想成一件物品,而字符串s当成背包。完全背包问题。最开始想的第一种方法居然是构造前缀树Trie,进行搜索。

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {int len = s.length();vector<bool> dp(len + 1, false);// 完全背包dp[0] = true;int n = wordDict.size();for (int i = 1; i <= len; i++) {for (int j = 0; j < n; j++) {int t = wordDict[j].size();if (t <= i && dp[i - t] && s.substr(i - t, t) == wordDict[j]) {dp[i] = true;break;}}}return dp[len];}
};


http://www.ppmy.cn/news/1412374.html

相关文章

ctfshow web入门 文件上传web162--web167

web162 session文件包含条件竞争 直接包含不传马了 我们上传的文件如果不符合要求&#xff0c;就会被删除&#xff0c;导致成功上传无法访问&#xff0c;没有用。但是如果我们上传的速度比服务器删的速度快&#xff0c;就可以了。 上传.user.ini GIF89a auto_append_file/tmp/…

【leetcode面试经典150题】6.轮转数组(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Mysql中将查询字段中间部分加密(CONCAT函数和SUBSTRING函数)

场景&#xff1a; 我想将openid字段和order_no字段前后保留4个字符&#xff0c;中间部分无论多长都用“******”进行替换掉&#xff0c;我应该怎么写sql&#xff1f; 示例&#xff1a; SELECT CONCAT(SUBSTRING(openid, 1, 4), ******, SUBSTRING(openid, LENGTH(openid) - …

25.11 MySQL 视图

1. 常见的数据库对象 对象描述表(TABLE)存储数据的逻辑单元, 以行和列的形式存在, 列就是字段, 行就是记录.数据字典系统表, 存放数据库相关信息的表. 数据通常由数据库系统维护, 程序员通常不可修改, 只可查看.约束(CONSTRAINT)执行数据校验的规则, 用于保证数据完整性的规则…

RISC-V 指令学习

学习资料&#xff1a;RISC-V原子指令LR/SC_lr sc-CSDN博客

Linux(Ubuntu)中创建【samba】服务,用于和Windows系统之间共享文件

目录 1.先介绍一下什么是Samba 2.安装&#xff0c;配置服务 安装 配置&#xff08;smb.conf&#xff09; 配置用户 3.出现的问题&#xff08;Failed to add entry for user XXXX&#xff09; 4.创建文件夹 5.windows访问 6.其他 Samba【服务状态】查看 Samba服务启动…

《看漫画学C++》第9章 直达记忆深处的数据类型——指针类型

C中最难的主题之一莫过于指针&#xff0c;《看漫画学C》通过漫画形式介绍知识。 上述知识点摘录于&#xff1a;《看漫画学C》第9章 直达记忆深处的数据类型——指针类型

pyaudio webrtcvad实现实时录制语音加VAD检测没人说话自动停止录制

vad检测没人说话超过2秒就自动停止录制并保存前面有人说话的音频文件 pip install webrtcvad代码: import pyaudio import wave import time import webrtcvadCHUNK = 320 # 20ms 的语音帧 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 WAVE_OUTPUT_FILENAME