自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(193)
  • 收藏
  • 关注

原创 leetcode-代码随想录-动态规划-377组合总和Ⅳ

因为递推公式dp[j] += dp[j - nums[i]]的缘故,dp[0]要初始化为1,这样递归其他dp[j]的时候才会有数值基础。初始化为0,这样才不会影响dp[j]累加所有的dp[j - nums[i]]。dp[j]: 凑成目标正整数为j的排列个数为dp[ji]至于非0下标的dp[j]应该初始为多少呢?题目数据保证答案符合 32 位整数范围。本题实际是求排列总和;

2025-08-06 21:13:19 363

原创 leetcode-代码随想录-动态规划-518零钱兑换Ⅱ

纯完全背包求得装满背包的最大价值是多少,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行!那么二维数组的最上行 和 最左列一定要初始化,即dp[0][j]和dp[i][0]要初始化。在讲完全背包时,一维dp数组,两个for循环的先后顺序都是可以。也是求装满背包的组合方法数,是01背包。二维DP数组的完全背包的两个for循环先后顺序是无所谓的。装满背包容量为 0 的方法是 1, 即不放任何物品,dp[j]:凑成总金额j的货币组合数为dp[j]先遍历背包,还是先遍历物品都是可以的。

2025-08-06 17:02:10 1001

原创 leetcode-代码随想录-动态规划-01背包总结&完全背包理论基础&两者对比

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。重量价值物品0115物品1320物品2430每件商品都有无限个!问背包能背的物品最大价值是多少?

2025-08-03 21:54:58 884

原创 leetcode-代码随想录-动态规划-494目标和

所以此时装满背包的方法值 等于 不放物品i的装满背包的方法,即:dp[i][j] = dp[i - 1][j];递推公式:dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];dp[i][j] 去掉 行的维度,即 dp[j],表示:填满j(包括j)这么大容积的包,有dp[j]种方法。dp[0][0] 初始为1,这里dp[0] 同样初始为1 ,即装满背包为0的方法有一种,放0件物品。先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。

2025-08-01 21:01:53 943

原创 leetcode-代码随想录-动态规划-1049最后一块石头的重量 II

01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);那么分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。那么相撞之后剩下的最小石头重量就是 (sum - dp[target]) - dp[target]。既然 dp[j]中的j表示容量,那么最大容量(重量)是多少呢,就是所有石头的重量和。最后dp[target]里是容量为target的背包所能背的最大重量。dp[j]都初始化为0就可以了。

2025-08-01 21:01:16 904

原创 leetcode-代码随想录-动态规划-416分割等和子集

如果背包所载重量为target, dp[target]就是装满 背包之后的总价值,因为 本题中每一个元素的数值既是重量,也是价值,所以,当 dp[target] == target 的时候,背包就装满了。01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);从dp[j]的定义来看,首先dp[0]一定是0。dp[j]的数值一定是小于等于j的。

2025-08-01 21:00:56 743

原创 leetcode-代码随想录-动态规划-01背包一维dp

背包最大重量为4。问背包能背的物品最大价值是多少?

2025-08-01 21:00:35 462

原创 leetcode-代码随想录-动态规划-01背包二维dp

其实从递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);递归公式中可以看出dp[i][j]是靠dp[i-1][j]和dp[i - 1][j - weight[i]]推导出来的。dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括正上方向),dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

2025-08-01 21:00:13 550

原创 leetcode-代码随想录-动态规划-96不同的二叉搜索树

j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量。所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]dp[i]:1到 i 为节点组成的二叉搜索树的个数为 dp[i]。

2025-08-01 20:59:25 242

原创 leetcode-代码随想录-动态规划-343整数拆分

dp[0] dp[1] 就不应该初始化,也就是没有意义的数值。dp[i]:数字 i 拆分后得到的最大乘积值。因为dp[i]取的是所有拆分方式的最大值;类型,但这仅将整数拆分为两个数相乘;),并使这些整数的乘积最大化。返回 你可以获得的最大乘积。dp[i]最大乘积怎么得到?

2025-08-01 20:58:21 227

原创 leetcode-代码随想录-动态规划-63不同路径Ⅱ

所以 从dp[i - 1][j]到dp[i][j]仍是需要 dp[i-1][j]条路径,从(i-1,j)仅是再多走一步就到(i,j),而不是求步数。dp[i - 1][j] :是从(0, 0)的位置到(i - 1, j)有dp[i - 1][j]条路径;dp[i][j - 1]:是从(0, 0)的位置到(i, j - 1)有dp[i][j - 1]条路径;所以 dp[i][j]只有两个方向来推导,dp[i-1][j]和dp[i][j-1]。注意:dp[i-1][j]表示的是有多少条路径,而不是有多少步;

2025-08-01 20:58:01 883

原创 leetcode-代码随想录-动态规划-62不同路径

所以 从dp[i - 1][j]到dp[i][j]仍是需要 dp[i-1][j]条路径,从(i-1,j)仅是再多走一步就到(i,j),而不是求步数。dp[i - 1][j] :是从(0, 0)的位置到(i - 1, j)有dp[i - 1][j]条路径;dp[i][j - 1]:是从(0, 0)的位置到(i, j - 1)有dp[i][j - 1]条路径;所以 dp[i][j]只有两个方向来推导,dp[i-1][j]和dp[i][j-1]。注意:dp[i-1][j]表示的是有多少条路径,而不是有多少步;

2025-08-01 20:57:37 396

原创 leetcode-代码随想录-动态规划-746使用最小花费爬楼梯

由于每次选择向上爬一个或者两个台阶,所以 dp[i]是与dp[i-1]和dp[i-2]有关的。个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。那么究竟是选从dp[i-1]跳还是从dp[i-2]跳呢?仅向上跳,才有花费,当在 0 台阶和 1 台阶时是不花费的。dp[i]:到达 第 i 阶 所需要的最小的花费。请你计算并返回达到楼梯顶部的最低花费。题意:“可以选择从下标为。

2025-08-01 20:57:20 213

原创 leetcode-代码随想录-动态规划-70爬楼梯

dp[i]:达到 i 阶有 dp[i] 种方法;你有多少种不同的方法可以爬到楼顶呢?所以初始化:是从 n = 1 即 1 阶开始的。

2025-08-01 20:56:39 215

原创 leetcode-代码随想录-动态规划-509斐波那契数

开始,后面的每一项数字都是前面两项数字的和。dp[i]:第 i 个斐波那契数的dp[i]主要用于 debug,判断代码是否正确。表示)形成的序列称为。

2025-08-01 20:56:22 251

原创 leetcode-代码随想录-动态规划-理论基础

2025-08-01 20:56:08 76

原创 leetcode-代码随想录-贪心算法-738单调递增的数字

时,我们称这个整数是单调递增的。当且仅当每个相邻位数上的数字。的最大数字,且数字呈。

2025-08-01 20:55:47 205

原创 leetcode-代码随想录-贪心算法-56合并区间

请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。

2025-08-01 20:55:26 109

原创 leetcode-代码随想录-贪心算法-763划分字母区间

我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是。返回一个表示每个字符串片段的长度的列表。

2025-07-30 21:11:05 404

原创 leetcode-代码随想录-贪心算法-435无重叠区间

返回 需要移除区间的最小数量,使剩余区间互不重叠。本题与用最少数量的箭引爆气球解题思路是相似的。只在一点上接触的区间是。

2025-07-30 21:10:15 319

原创 leetcode-代码随想录-贪心算法-452用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组。处射出一支箭,若有一个气球的直径的开始和结束坐标为。弓箭一旦被射出之后,可以无限地前进。一支弓箭可以沿着 x 轴从不同点。,返回引爆所有气球所必须射出的。可以射出的弓箭的数量。

2025-07-30 21:09:22 372

原创 leetcode-代码随想录-贪心算法-406根据身高重建队列

排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。表示队列中一些人的属性(不一定按顺序)。返回的队列应该格式化为数组。假设有打乱顺序的一群人站成一个队列,数组。此时就按照题目的要求完成了重新排列。请你重新构造并返回输入数组。是排在队列前面的人)。

2025-07-30 21:07:58 334

原创 leetcode-代码随想录-贪心算法-860柠檬水找零

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。只需要维护三种金额的数量,5,10和20。注意,一开始你手头没有任何零钱。

2025-07-30 21:06:54 335

原创 leetcode-代码随想录-贪心算法-135分发糖果

思路:先确定一边,再确定另一边。表示每个孩子的评分。

2025-07-30 21:06:05 392

原创 leetcode-代码随想录-贪心算法-134加油站

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回。每个加油站的剩余量rest[i]为gas[i] - cost[i]。个加油站需要消耗汽油。

2025-07-30 21:05:01 334

原创 leetcode-代码随想录-贪心算法-1005K次取反后最大化的数组和

此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。以这种方式修改数组后,返回数组。可以多次选择同一个下标。

2025-07-30 21:04:19 184

原创 leetcode-代码随想录-贪心算法-45跳跃游戏Ⅱ

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。本题要计算最少步数,那么就要想清楚什么时候步数才一定要加一呢?整体最优:一步尽可能多走,从而达到最少步数。向后跳转的最大长度。当移动下标达到了当前覆盖的最远距离下标时。本体也是采用最大覆盖范围。的 0 索引整数数组。处,你可以跳转到任意。

2025-07-30 21:03:36 399

原创 leetcode-代码随想录-贪心算法-55跳跃游戏

局部最优推出全局最优,找不出反例,试试贪心!i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。

2025-07-30 21:00:29 217

原创 leetcode-代码随想录-贪心算法-122买卖股票的最佳时机Ⅱ

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。在每一天,你可以决定是否购买和/或出售股票。你也可以先购买,然后在 同一天 出售。假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。从图中可以发现,其实我们需要收集每天的正利润就可以,返回 你能获得的 最大 利润。

2025-07-30 20:59:45 365

原创 leetcode-代码随想录-贪心算法-53最大子数组和

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。全局最优:选取最大“连续和”

2025-07-30 20:58:31 167

原创 leetcode-代码随想录-贪心算法-376摆动序列

result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)在计算是否有峰值的时候,遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果。不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

2025-07-30 20:57:05 313

原创 leetcode-代码随想录-贪心算法-455分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。,这是能让孩子们满足胃口的饼干的最小尺寸;,我们可以将这个饼干。

2025-07-30 20:56:02 263

原创 leetcode-代码随想录-贪心算法-理论基础

实际做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。贪心的本质是选择每一阶段的局部最优,从而达到全局最优。

2025-07-30 20:54:43 108

原创 leetcode-代码随想录-回溯算法-总结篇

题意:给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。题意:给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。排列是有序的,元素会重复使用。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!与46全排列的区别:本题的nums包含重复数字,所以涉及到去重(同一树层上的元素去重)。题意:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

2025-06-23 20:38:48 767

原创 leetcode-代码随想录-回溯算法-47全排列Ⅱ

与上一题 46.全排列的区别:本题的nums中有重复元素,所以就涉及到。返回所有不重复的全排列。对同一树层的重复元素去重。的序列 nums ,按。

2025-06-23 20:29:48 277

原创 leetcode-代码随想录-回溯算法-46全排列

当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。排列是在叶子节点收集结果。

2025-06-23 20:28:55 364

原创 leetcode-代码随想录-回溯算法-491非递减子序列

90.子集Ⅱ:返回整数数组nums(含有重复元素)的所有子集,子集不能重复。代码逻辑是先对数组 nums 进行排序,再加一个 used 数组进行标记来达到去重的目的。本题是求递增子序列,所以 就不能对原数组进行排序,排完序的数组得到的子集都是递增的了。所以也不能使用 used数组标记 来去重。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。,找出并返回所有该数组中不同的递增子序列,递增子序列中。并要求递增子序列的长度至少为2,则有收集结果的条件要求。

2025-06-23 20:27:56 288

原创 leetcode-代码随想录-回溯算法-90子集Ⅱ

与上一题 78.子集的区别是:本题数组 nums 中存在重复元素,但结果不能包含重复的子集。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。给你一个整数数组 nums ,其中可能包含。,请你返回该数组所有可能的 子集(幂集)。

2025-06-23 20:26:41 290

原创 leetcode-代码随想录-回溯算法-78子集

组合问题和分割问题是收集树的叶子节点,而子集问题是找树的所有节点!解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。返回该数组所有可能的子集(幂集)。

2025-06-23 20:25:11 148

原创 leetcode-代码随想录-回溯算法-93复原IP地址

递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符.),同时记录分割符的数量pointNum 要 +1。本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在。回溯的时候,就将刚刚加入的分隔符. 删掉就可以了,pointNum也要-1。pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。是 有效 IP 地址,但是。

2025-06-23 20:24:12 321

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除