leetcode刷题
文章平均质量分 67
leetcode
Binary Oracle
一名热爱开源和技术的Coder , 开源框架spring committer , golang开源网络库netpoll committer; (脱产备战25考研中,停更一年)
展开
-
常见解题套路
异或运算: 判断两个值是否不同,相同为0,不同为1,体现在二进制位上则为: 1^ 0=1 或者 0^ 1=1 或者 0 ^0=0 或者 1 ^1=0。最快的解答方法,就是把所有数组成员(A[0] 一直到 A[n-2])与 1 到 n 的整数全部放在一起,进行异或运算。一个数组包含 n-1 个成员,这些成员是 1 到 n 之间的整数,且没有重复,请找出缺少的那个数字。原理很简单,如果明文是 x,密钥是 y,那么 x 连续与 y 进行两次异或运算,得到自身。多个值的异或运算,可以根据运算定律进行简化。原创 2023-03-04 11:23:48 · 510 阅读 · 0 评论 -
leetcode 30. 串联所有单词的子串----滑动窗口篇八
串联所有单词的子串题解集合暴力匹配版滑动窗口用哈希优化暴力滑动滑动距离优化+哈希优化暴力匹配版滑动窗口思路:首先,最直接的思路,判断每个子串是否符合,符合就把下标保存起来,最后返回即可。首先这里滑动窗口的大小是固定的,为words数组中的元素个数乘以单词长度,这里words数组中每一个单词的长度均相等那么只需要用两个指针l和r,固定区间为[l,r)的滑动窗口,然后检查当前[l,r)的滑动窗口是不是满足与words数组中的单词完全匹配,如果满足,保存下标,然后更新区间,即区间整体右移一位...原创 2021-06-13 17:12:33 · 858 阅读 · 15 评论 -
leetcode 746. 使用最小花费爬楼梯----动态规划篇
使用最小花费爬楼梯题解集合递归动态规划动态规划优化---状态压缩递归思路:将问题转化为对二叉树的遍历,因为初始阶段可以选择0或1,因此会有两颗二叉树,那么最终结果取这两颗二叉树中较小值代码:class Solution {public: int minCostClimbingStairs(vector<int>& cost) { //第一个元素必选,因此我们从第二个元素开始判断 return min(dfs(cost, 1,true)+cost[0], ..原创 2021-06-09 11:56:33 · 730 阅读 · 41 评论 -
1. 两数之和---双指针篇七
两数之和题解集合引言暴力法哈希法排序加二分查找双指针引言本题的双指针解法解释的可能不够清楚,建议大家先看这篇文章:leetcode 167. 两数之和 II - 输入有序数组----双指针篇六,二分篇二暴力法思路:枚举所有nums[i]+nums[j]的可能结果,从中找出等于目标值的结果,然后返回对应下标注意:这里不能对nums数组进行降序排列,到达减枝效果,因为这样会导致元素下标发生改变,如果非要做,可以考虑用哈希表保存元素在原数组的下标代码:class Solution {p..原创 2021-06-06 22:29:51 · 737 阅读 · 19 评论 -
leetcode 167. 两数之和 II - 输入有序数组----双指针篇六,二分篇二
两数之和二题解集合暴力法二分查找法双指针法暴力法思路:枚举出数组中所有两个元素相加的可能结果,与给定目标值进行比较代码:class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { for (int i = 0; i < numbers.size(); i++) { for (int j = i + 1; j < numbers.s..原创 2021-06-06 20:33:50 · 775 阅读 · 20 评论 -
leetcode 210. 课程表 II----拓扑排序篇二
课程表二题解集合拓扑排序---BFS拓扑排序—BFS引言:「拓扑排序」是专门应用于有向图的算法;「拓扑排序」的结果不唯一;删除结点的操作,通过「入度数组」体现,这个技巧要掌握;「拓扑排序」的一个附加效果是:能够顺带检测有向图中是否存在环,这个知识点非常重要,如果在面试的过程中遇到这个问题,要把这一点说出来。思路:1、在开始排序前,扫描对应的存储空间(使用邻接表),将入度为 0 的结点放入队列。2、只要队列非空,就从队首取出入度为 0 的结点,将这个结点输出到结果集中,并且将这个...原创 2021-06-06 18:03:39 · 653 阅读 · 19 评论 -
leetcode 207. 课程表---拓扑排序篇一
课程表题解集合引言拓扑排序二级目录三级目录引言本题涉及到了拓扑排序相关的概念,如果对拓扑排序不了解的,建议看这篇文章AOV网与拓扑排序拓扑排序二级目录三级目录原创 2021-06-05 23:03:08 · 1044 阅读 · 17 评论 -
1423. 可获得的最大点数---滑动窗口篇七,前缀和篇三
可获得的最大点数题解集合递归前缀和滑动窗口总结递归思路:你是不是跟我一样,拿到今天题目的第一想法是模拟题目取卡牌的过程呢?模拟的方法可以用递归。但是递归的过程是把所有的可能组合方式都求了一遍,时间复杂度会达到 O(N*k) ,在题目所给出的 10 ^ 5 的数据规模下,会超时。下面的代码是我用的递归+记忆化的方式写的,虽然有记忆化,但是因为没有降低时间复杂度,所以仍然超时。提供在这里仅供大家参考。欢迎大家提供能 AC 的递归方法。我定义的递归函数 dfs(cardPoints, i, j, ..原创 2021-06-04 15:22:00 · 687 阅读 · 19 评论 -
leetcode 643. 子数组最大平均数 I ------滑动窗口篇六,前缀和篇二
子数组最大平均数 I暴力法思想暴力法的优化思路滑动窗口前缀和暴力法思想从数组头部开始,依次枚举所有长度为k的连续子数组,对其求和,从中找出最大值class Solution {public: double findMaxAverage(vector<int>& nums, int k) { int l = 0, r = k; double res = INT_MIN; while (r <=nums.size()) { //注意:左闭右开的区.原创 2021-06-04 11:01:16 · 737 阅读 · 24 评论 -
leetcode 1208. 尽可能使字符串相等-----滑动窗口篇五,前缀和篇一,二分篇一
尽可能使字符串相等题解集合滑动窗口滑动窗口思路:两个长度相等字符串的 s 和 t ,把 i 位置的 s[i] 转成 t[i] 的开销是两者 ASCII 码之差的绝对值。题目给出了允许的最大预算 maxCost ,求不超过预算的情况下能够转换的最长子串。比如,对于 s = “abcd”, t = “bcdf”, cost = 3 而言,我们使用 costs[i] 表示从 s[i] 转成 t[i] 的开销,那么 costs = [1, 1, 1, 2] 。由于 maxCost = 3, 所以最多..原创 2021-06-03 22:18:43 · 783 阅读 · 15 评论 -
leetcode 52. N皇后 II----回溯篇8
N皇后||题解集合回溯法回溯法本题就是leetcode 面试题 08.12. 八皇后----回溯篇7,也就是我们回溯篇7中讲过的问题,只不过这里区别在于,第 51 题需要得到所有可能的解,这道题只需要得到可能的解的数量。因此这道题可以使用第 51 题的做法,只需要将得到所有可能的解改成得到可能的解的数量即可。这里只演示使用回溯篇6中第一种方式的做法,详情可以去看回溯篇6具体求解过程也不再啰嗦,详情去看回溯篇6代码:class Solution { int sum = 0; vector..原创 2021-06-02 16:17:19 · 197 阅读 · 3 评论 -
leetcode 面试题 08.12. 八皇后----回溯篇7
八皇后题解集合回溯法判断当前位置是否能放置皇后的另一种思路回溯法之前已经写过了一篇文章关于八皇后问题,本题旧题重拾,详细讲解一番八皇后问题轻松解决注意:皇后的走法是:可以横直斜走,格数不限。因此要求皇后彼此之间不能相互攻击,等价于要求任何两个皇后都不能在同一行、同一列以及同一条斜线上。并且本题相对原题做了扩展,求的是N皇后的各种摆法思路:问题分析:假设有皇后Q1(x1,y1)和Q2(x2,y2)不在同一行:x1!=x2不在同一列:y1!=y2不在同一左对角线上:x1+ y1 .原创 2021-06-02 15:58:21 · 804 阅读 · 27 评论 -
leetcode 395. 至少有 K 个重复字符的最长子串----双指针篇5,滑动窗口篇4,新人理解递归必看篇!!
至少有 K 个重复字符的最长子串题解集合递归---分而治之滑动窗口---双指针总结点评递归—分而治之解题思路本题要求的一个最长的子字符串的长度,该子字符串中每个字符出现的次数都最少为 kk。递归要点:重点:我们在调用递归函数的时候,把递归函数当做普通函数(黑箱)来调用,即明白该函数的输入输出是什么,而不用管此函数内部在做什么。下面是详细讲解。递归最基本的是记住递归函数的含义(务必牢记函数定义):本题的 longestSubstring(s, k) 函数表示的就是题意,即求一个最长的子字符.原创 2021-06-01 22:19:29 · 838 阅读 · 17 评论 -
leetcode 47. 全排列 II---回溯篇6
全排列 | | 题解集合引言回溯法引言注意本题与leetcode 46. 全排列----回溯篇5的区别,区别在于本题所给的可选数组中出现了重复数字,并且要求我们返回所有不重复的全排列回溯法思路:可选数组中出现重复数字,那么为什么重复数字会产生重复的全排列呢?由图中可以看出,因为出现可选数组出现了两个相邻的数字1,因此,当我们选择第二个数字1时,下面的分支是于第一个数字1完全重复的,因此我们需要进行去重操作。这里去重思路参考三数之和,先对可选数组进行排序,目的是让重复元素相邻,这里我们可.原创 2021-05-30 14:55:04 · 445 阅读 · 21 评论 -
leetcode 46. 全排列----回溯篇5
全排列题解集合回溯法总结回溯法把问题转化为对一个多叉树的遍历过程细节:我们需要设置一个访问数组visited,防止一个数字被多次放入当前结果数组中。举例: 数组【1,2,3】一开始我们选择了数字1,然后进入二叉树第三层,此时我们需要从头开始选取,即从1开始选取,为什么呢?当我们选择1后,可以直接从1后面的2和3开始选择,选2后只能选3,得到一个排列1,2,3那么如果选了3后,应该往前取选择还没被选择的二,怎么往前去选择还没被选择的二呢?当然是从头开始找,即从1开始到3之前结束,看看哪.原创 2021-05-30 14:19:37 · 1226 阅读 · 23 评论 -
leetcode 1869. 哪种连续子字符串更长---滑动窗口篇3,双指针篇4
哪种连续子字符串更长题解集合滑动窗口二级目录三级目录滑动窗口思路:设置两个滑动窗口,一个滑动窗口内都是字符为1的,一个滑动窗口内都是字符为0的设置两个左端指针o和z,分别记录包含字符1的滑动窗口的左端和包含字符0的滑动窗口的左端再设置一个指针i,从字符串s的开始一直遍历到结尾,相当于两个滑动窗口的右端具体操作过程看下方图解:二级目录三级目录...原创 2021-05-29 21:23:50 · 511 阅读 · 16 评论 -
leetcode 1438. 绝对差不超过限制的最长连续子数组----双指针篇3,滑动窗口篇2
绝对差不超过限制的最长连续子数组题解集合暴力法滑动窗口和双指针利用单调队列找出当前滑动窗口的最大最小值单调队列的优化思路总结暴力法思路:列举出所有满足条件的子数组,从中找出最大的长度代码:class Solution {public: int longestSubarray(vector<int>& nums, int limit) { if (nums.empty()) return 0; if (nums.size() == 1) return 1;...原创 2021-05-29 18:00:44 · 1937 阅读 · 23 评论 -
leetcode 11. 盛最多水的容器----双指针篇2
盛水最多的容器题解集合暴力法双指针法暴力法思路:双重for循环列举出所有可能答案,找出其中的最大结果class Solution {public: int maxArea(vector<int>& height) { int maxArea = 0; for (int i = 0; i < height.size(); i++) { for (int j = 1; j < height.size(); j++) maxArea =..原创 2021-05-29 15:08:39 · 488 阅读 · 21 评论 -
leetcode 3. 无重复字符的最长子串----滑动窗口篇1,双指针篇1
无重复字符的最长子串题解集合滑动窗口---双指针法哈希表优化数组(桶)代替哈希表动态规划滑动窗口—双指针法思路:这道题主要用到思路是:滑动窗口什么是滑动窗口?其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!如何移动?我们只要把队列的左边的元素移出就行了,直到满足题目要求!一直维持这样的队列,找出队列出现最长的长度时候,求出解!时间复杂度:O(n)图解..原创 2021-05-28 21:12:12 · 593 阅读 · 18 评论 -
216. 组合总和 III-----回溯篇4
组合总和 ||| 题解结合回溯法总结回溯法本篇题解给的不是特别详细,因为本题与leetcode 40. 组合总和 II—回溯篇3相比,就增添了一个限制条件罢了,建议先看第40题再来看本题显然这里与leetcode 40. 组合总和 II—回溯篇3较为相似,1—9中每个数字都只能选择一次,且这里结果数组中不能出现重复数字。注意这里1—9就相当于第40题中给出的数组,并且里面的元素已经排好了序,因此我们下面的限制条件可以这样写: for (int i = index; i <= 9&.原创 2021-05-28 15:12:06 · 402 阅读 · 28 评论 -
leetcode 39. 组合总和---回溯篇2
组合总和题解集合回溯法总结回溯法这里还是把问题转化为多叉树的遍历问题,但是这里需要提前对数组进行排序,用来去除重复结果,如果不懂排序如何去重的建议先看leetcode 40. 组合总和 II—回溯篇3三数之和为什么会有重复结果,可以参考下图:重复源头1:针对上诉情况的代码:if(i>start&&arr[i]==arr[i-1]) continue;但这里题目中说了,没有重复数字,因此不需要写上面的代码,如果下次出现了重复数字,就需要考虑写上上面的代码。重复源..原创 2021-05-28 13:56:40 · 543 阅读 · 26 评论 -
leetcode 40. 组合总和 II---回溯篇3
组合总和||题解集合回溯法哈希法去重回溯法解题思路:一句话题解:按顺序搜索,设置合理的变量,在搜索的过程中判断是否会出现重复集结果。重点理解对输入数组排序的作用与第 39 题(组合之和)的差别这道题与上一问的区别在于:第 39 题:candidates 中的数字可以无限制重复被选取;第 40 题:candidates 中的每个数字在每个组合中只能使用一次。相同点是:相同数字列表的不同排列视为一个结果。如何去掉重复的集合(重点)为了使得解集不包含重复的组合。有以下 22 种方案...原创 2021-05-28 12:32:10 · 582 阅读 · 29 评论 -
leetcode 37. 解数独----回溯篇1
解数独题解集合回溯法回溯法这题和八皇后有点相似,不同的是八皇后每行只放一个就可以到下一行继续尝试,而这道题每行都放完没有冲突之后才能到下一行继续尝试,所以判断的逻辑稍微比八皇后多一点,但整体思路没差多少思路每一个空白格都要选一个数字去填,有多少个空白格,做多少次选择。可以想到递归,每次递归填当前的格子,选填 i,board 的状态就更新了。子递归呢?基于填了 i 的新 board,给下一个格子填数。每个递归的子问题,面对一个新 board。按顺序填下去,如果不是空白格,就继续递归填...原创 2021-05-27 19:31:15 · 716 阅读 · 28 评论 -
leetcode 474. 一和零
一和零题解集合动态规划----01背包问题滚动数组优化一维优化总结记忆化搜索总结动态规划----01背包问题来说题,本题不少同学会认为是多重背包,一些题解也是这么写的。其实本题并不是多重背包,再来看一下这个图,捋清几种背包的关系多重背包是每个物品,数量不同的情况。本题中strs 数组里的元素就是物品,每个物品都是一个字符串而m 和 n相当于是一个背包,两个维度的背包。理解成多重背包的同学主要是把m和n混淆为物品了,感觉这是不同数量的物品,所以以为是多重背包。但本题其实是01背包问题...原创 2021-05-27 16:25:23 · 661 阅读 · 34 评论 -
leetcode 494. 目标和
目标和题解集合记忆化搜索动态规划滚动数组优化一维优化---巧妙转换为01背包问题记忆化搜索思路:将问题转化为对一颗多叉树的遍历,而这里每个数字都有+与-的两种选择,因此这里是构造成二叉树。看下图:这里显然还有大量重复计算的问题,因此需要用哈希表来保存已经计算出来的结果这里注意递归结束条件有两个:1.所有数字都用过,并且找到和为目标值的一种方案,返回12.所有数字都用过,但未找到和为目标值的方案,返回0代码:class Solution { unordered_map<st..原创 2021-05-26 17:51:07 · 1812 阅读 · 33 评论 -
leetcode 139. 单词拆分---完全背包问题之true or false类型
单词拆分题解集合动态规划记忆化搜索三级目录动态规划单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包!动规五部曲分析如下:1.确定dp数组及其下标的含义dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。2.确定递推公式如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。所以.原创 2021-05-25 22:10:27 · 770 阅读 · 20 评论 -
leetcode 377. 组合总和 Ⅳ----动态规划之双重for循环变式----求排列数
组合总和 Ⅳ题解集合动态规划二维处理动态规划(降维优化)动态规划---完全背包的一维套路模板双重for循环变式对上述动态规划的一个小总结记忆化搜索进阶关于溢出说明cpp溢出解决方法动态规划二维处理本题与「完全背包求方案数」问题的差别在于:选择方案中的不同的物品顺序代表不同方案。举个 ????,在「完全背包」问题中,凑成总价值为 6 的方案 [1,2,3] 算是 11 种方案,但在本题算是 3 * 2 * 1 = 63∗2∗1=6 种方案([1,2,3],[2,1,3],[3,1,2] … )。因此原创 2021-05-24 10:36:14 · 1602 阅读 · 42 评论 -
leetcode 36. 有效的数独
有效的数独题解集合数组法哈希法数组法解题思路1.由于board中的整数限定在1到9的范围内,因此可以分别建立数组来存储任一个数在相应维度上是否出现过。维度有3个:所在的行,所在的列,所在的box,注意box的下标也是从左往右、从上往下的。2.遍历到每个数的时候,例如boar[i][j],我们判断其是否满足三个条件:在第 i 个行中是否出现过在第 j 个列中是否出现过在第 j/3 + (i/3)*3个box中是否出现过.为什么是j/3 + (i/3)*3呢?3.关于从数组下标到b...原创 2021-05-23 21:11:07 · 564 阅读 · 25 评论 -
leetcode 17. 电话号码的字母组合----回溯算法
电话号码的字母组合题解集合回溯算法BFS---队列求解总结回溯算法将问题转化为对一颗多叉树的遍历过程,可以大大简化思维和实现难度由上图可得:递归结束条件: 输入的数字个数与当前已经找到的字母个数一致,说明找到了一个可行方案,然后将可行方案保存到ret数组中递归返回值:void本级递归做什么:遍历当前数字对应剩余的字母,看能否找到其余解代码:class Solution { unordered_map<char, string> map;//保存每个数字映射的字母...原创 2021-05-23 16:51:50 · 705 阅读 · 20 评论 -
今天就来揭开多重背包的面纱!!!
多重背包题目描述朴素二维c++完整测试代码滚动数组一维空间优化与其他背包的内在关系总结题目描述有 N 种物品和一个容量为 C 的背包,每种物品「数量有限」。第 i 件物品的体积是 v[i],价值是 w[i],数量为 s[i] 。问选择哪些物品,每件物品选择多少件,可使得总价值最大。其实就是在 0-1 背包问题的基础上,增加了每件物品可以选择「有限次数」的特点(在容量允许的情况下)。示例 1:输入: N = 2, C = 5, v = [1,2], w = [1,2], s = [2,1]原创 2021-05-23 15:03:22 · 945 阅读 · 20 评论 -
leetcode 518. 零钱兑换 II-----完全背包套路模板
零钱兑换 II 题解集合完全背包(朴素解法)完全背包(一维优化)三级目录完全背包(朴素解法)在leetcode 322. 零钱兑换中,我们求的是「取得特定价值所需要的最小物品个数」。对于本题,我们求的是「取得特定价值的方案数量」。求的东西不一样,但问题的本质没有发生改变,同样属于「组合优化」问题。你可以这样来理解什么是「组合问题」:被选物品之间不需要满足特定关系,只需要选择物品,以达到「全局最优」或者「特定状态」即可。同时硬币相当于我们的物品,每种硬币可以选择「无限次」,很自然的想到...原创 2021-05-22 14:30:40 · 752 阅读 · 26 评论 -
今天老夫就把完全背包的底裤给你扒出来瞅瞅!!!
来我房里有些好康的,来看看完全背包的底裤完全背包二级目录三级目录完全背包有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。在下面的讲解中,我依然举01背包的底裤里面的这个例子:背包最大重量为4。物品为:每件商品都有无限个!问背包能背的物品最大价值是多少?01背包和完全背包唯一不同就原创 2021-05-21 22:35:55 · 861 阅读 · 28 评论 -
把01背包问题的底裤扒个底朝天!!!
三点几啦,弄啥子弄啊,看01背包问题先啦!!!01背包二维dp数组01背包完整C++测试代码总结下面我们将进入01背包优化环节----滚动数组一维dp数组(滚动数组)01背包有N件物品和一个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。这是标准的背包问题,以至于很多同学看了这个自然就会想到背包,甚至都不知道暴力的解法应该怎么解了。这样其实是没有从底向上去思考,而是习惯性想到了背包,那么原创 2021-05-21 20:05:50 · 1233 阅读 · 33 评论 -
leetcode 322. 零钱兑换----完全背包套路解法详细再探
零钱兑换完全背包套路解法再探引言完全背包(朴素解法)无效状态的定义问题--顺带滚动数组优化完全背包(一维优化)引言leetcode 322. 零钱兑换本篇文章题解之前已经发过,但是对完全背包的解法只是模棱解释一番,今天再写一篇文章来详细探讨一下本题套用完全背包公式的解法完全背包套路题目:leetcode 279. 完全平方数LintCode 440 · 背包问题 III—完全背包问题本人目前刷题数量较少,先列举两道,O(∩_∩)O哈哈~完全背包(朴素解法)硬币相当于我们的物品,每种..原创 2021-05-20 15:15:02 · 540 阅读 · 29 评论 -
leetcode 279. 完全平方数----完全背包的套路
完全平方数题解集合完全背包(朴素解法)完全背包(进阶)三级目录完全背包(朴素解法)不了解完全背包问题的先看这篇文章首先「完全平方数」有无限个,但我们要凑成的数字是给定的。因此我们第一步可以将范围在 [1,n] 内的「完全平方数」预处理出来。这一步其实就是把所有可能用到的数字先预处理出来。同时由于题目没有限制我们相同的「完全平方数」只能使用一次。因此我们的问题转换为:给定了若干个数字,每个数字可以被使用无限次,求凑出目标值 n 所需要用到的是最少数字个数是多少。这显然符合「完全背包.原创 2021-05-20 13:20:40 · 658 阅读 · 30 评论 -
LintCode 464 · 整数排序 II
整数排序 II 题解集合归并排序归并排序迭代版本快速排序归并排序不懂归并排序的看这篇文章class Solution {public: //合并两个有序子序列 void merge(vector<int>& A,int begin,int mid,int end,vector<int>& temp) { //第一个子序列起点和第二个子序列起点,以及temp数组起点 int i = begin, j = mid + 1, k = 0; w..原创 2021-05-19 13:56:03 · 397 阅读 · 39 评论 -
LintCode 440 · 背包问题 III---完全背包问题
背包问题 III 题解集合一级目录二级目录三级目录一级目录二级目录三级目录原创 2021-05-19 09:57:21 · 546 阅读 · 39 评论 -
leetcode 416. 分割等和子集---直接解法
分割等和子集引言直接求解图解常规解法「滚动数组」解法「一维空间优化」解法引言基本的「将原问题抽象为 01 背包问题」的分析在 上一讲 讲过啦 ~本节要解决的问题是:如何将「间接求解」的方式转为「直接求解」,并学习为什么能这么做,此类做法是否有共性 ...直接求解我们先来回顾一下 上一讲 使用的「状态定义」和「转移方程」。状态定义:dp[i][j]代表考虑前 i 个数值,其选择数字总和不超过 j 的最大价值。转移方程:但题目并不是问我们「最大价值是多少」,而是问「是否能凑出最大..原创 2021-05-18 16:00:55 · 573 阅读 · 39 评论 -
leetcode 416. 分割等和子集
分割等和子集题解集合DFS记忆化搜索记忆化搜索的另一种写法动态规划「滚动数组」解法「一维空间优化」解法DFS思路题意就是:给你一个非空数组,和为sum,你能否找到一个子序列,和为sum/2。如果sum为奇数,肯定找不到,因为sum/2为小数,而数组只包含正整数。如果sum为偶数,有可能找到。对于每个元素,都有 选或不选它 去组成子序列。我们可以 DFS 回溯去穷举所有的情况。每次考察一个元素,用索引i描述,还有一个状态:当前累加的curSum。递归函数:基于已选的元素(和为cur..原创 2021-05-17 22:01:13 · 1269 阅读 · 42 评论 -
LindCode 92 · 背包问题----01背包问题
背包问题题解集合记忆化搜索动态规划三级目录记忆化搜索结束条件:背包装满了,或者枚举到第一个物品时返回值:返回枚举到当前物品时的最满状态本级递归做什么:计算当前物品放与不放入背包的结果,选择两个结果中最满的一种状态在这里插入代码片动态规划三级目录...原创 2021-05-17 12:43:21 · 586 阅读 · 48 评论