自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一和零力扣--474

其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。此时大家可以回想一下01背包的递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。给你一个二进制字符串数组。

2025-03-25 15:57:54 394

原创 目标和力扣--494

给你一个非负整数数组nums和一个整数target。向数组中的每个整数前添加'+'或'-',然后串联起所有整数,可以构造一个2'+'1'-'"+2-1"返回可以通过上述方法构造的、运算结果等于target的不同的数目。5一共有 5 种方法让最终目标和为 3。1。

2025-03-25 15:26:19 299

原创 最后一块石头的重量||力扣--1049

一堆的石头重量是sum,那么我们就尽可能拼成 重量为 sum / 2 的石头堆。这样剩下的石头堆也是 尽可能接近 sum/2 的重量。那么此时问题就是有一堆石头,每个石头都有自己的重量,是否可以 装满 最大重量为 sum / 2的背包。组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],

2025-03-19 10:51:42 345

原创 分割等和子集力扣--416

给你一个的数组nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。true数组可以分割成 [1, 5, 5] 和 [11]。false数组不能分割成两个元素和相等的子集。

2025-03-19 10:12:04 346

原创 正数拆分力扣--343

递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));确定遍历顺序,先来看看递归公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});枚举j的时候,是从1开始的。

2025-03-13 10:24:17 476

原创 不同路径II力扣--63

在初始化的时候,我们初始化的是第一行和第一列,在遇到障碍之前,都可以初始化为1,遇到障碍,他后面的无论如何也过不去,所以是0。在 遍历找路径的时候,当没有遇到障碍的时候,递推公式同力扣62,如果遇到障碍,那么就过不去,因为他只能往上和右走。1. 向右 -> 向右 -> 向下 -> 向下。2. 向下 -> 向下 -> 向右 -> 向右。机器人每次只能向下或者向右移动一步。返回机器人能够到达右下角的不同路径数量。机器人的移动路径中不能包含。3x3 网格的正中间有一个障碍物。测试用例保证答案小于等于。

2025-03-13 09:43:04 274

原创 不同路径力扣--62

这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

2025-03-13 09:13:27 408

原创 使用最小花费爬楼梯力扣--746

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:输入:cost = [10,15,20]输出:15解释:你将从下标为 1 的台阶开始。- 支付 15 ,向上爬两个台阶,到达楼梯顶部。总花费为 15 。示例 2:输入:cost = [1,100,1,1,1,100,1,1,100,1]输出:6解释

2025-03-12 10:16:29 453

原创 爬楼梯力扣--70

题目中给的n的范围是从1到45,所以是正整数,如果按照我们给dp的定义的话,他代表的是爬到第0层有多少种方法,由于给的范围压根没有0,所以对于dp【0】为多少的讨论是没有意义的,可以直接初始化dp【1】和【2】,然后再计算。不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。爬到第i层楼梯,有dp[i]种方法。

2025-03-12 09:47:56 308

原创 斐波那契数列力扣--509

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的。如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。F(n) = F(n - 1) + F(n - 2),其中 n > 1。开始,后面的每一项数字都是前面两项数字的和。dp[i]的定义为:第i个数的斐波那契数值是dp[i]用一个一维dp数组来保存递归的结果。表示)形成的序列称为。

2025-03-12 09:28:22 321

原创 动态规划理论基础

然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

2025-03-11 17:14:44 261

原创 单调递增数字力扣--738

举例子:1234,已经是递增, 从后往前遍历,没有需要修改的地方,那么进入到下面的循环,a这时候就在末尾他不小于s.length,所以不用进入到这个循环中,直接返回即可。在10的时候发现前面的数字比后面的大,1变成0 ,百位上的0变成9,后面的0仍然为0,最后结果为900,显然不是最大的,最大的应该是999。比如32:3大于2,如果3不减1的话,个位数没有办法在保证递增的情况下还满足题意,所以3-1,然后把个位变成9,最后结果为29。还要加后面的一个循环?的最大数字,且数字呈。时,我们称这个整数是。

2025-03-11 16:52:30 309

原创 合并区间力扣--56

区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。先排序,让所有的相邻区间尽可能的重叠在一起,按左边界。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。

2025-03-11 15:57:09 296

原创 划分字母区间力扣--763

给你一个字符串s。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串"ababcc"能够被分为,但类似或的划分是非法的。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是s。返回一个表示每个字符串片段的长度的列表。[9,7,8]划分结果为 "ababcbaca"、"defegde"、"hijhklij"。每个字母最多出现在一个片段中。像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。

2025-03-11 15:54:19 283

原创 无重叠区间力扣--435

你需要移除两个 [1,2] 来使剩下的区间没有重叠。你不需要移除任何区间,因为它们已经是无重叠的了。需要移除区间的最小数量,使剩余区间互不重叠。移除 [1,3] 后,剩下的区间没有重叠。只在一点上接触的区间是。

2025-03-10 17:27:09 262

原创 用最少数量的箭引爆气球

题目中说的是:满足 xstart ≤ x ≤ xend,则该气球会被引爆。局部最优:当气球出现重叠,一起射,所用弓箭最少。有一些球形气球贴在一堵用 XY 平面表示的墙面上。-在x = 11处发射箭,击破气球[10,16]和[7,12]。- 在x = 2处发射箭,击破气球[1,2]和[2,3]。- 在x = 4处射出箭,击破气球[3,4]和[4,5]。-在x = 6处射出箭,击破气球[2,8]和[1,6]。处射出一支箭,若有一个气球的直径的开始和结束坐标为。每个气球需要射出一支箭,总共需要4支箭。

2025-03-10 16:57:21 376

原创 根据身高重建队列力扣--406

当他把【6,1】插入到【7,1】前面的话,不会影响【7,1】前面只有一个大于等于他的情况,所以说从大到小排序。编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。

2025-03-10 16:27:07 1023

原创 柠檬水找零力扣--860

客户只会给5,10,20这三种数值的钱,给5时候不需要找零,给10找一个5,给20找一个十和两个五或者找三个五,由此可见,找5的灵活性更大,而给10只能找5,所以讨论的范围在给20 的时候,如果有10,优先给10,由此来计算。对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。

2025-03-06 09:50:56 5031

原创 分发糖果力扣--135

比较右边的大于左边的情况 ratings【i】>ratings[i+1],因为这里有i+1,所以遍历的时候是从下标为ratings.length-2的位置开始的。所以先从前往后,把下标为0的糖果数目先定为1,比较右边的大于左边的情况 ratings【i】>ratings[i-1],因为这里有i-1,所以遍历的时候是从下标为1的位置开始的。糖果: 1 2 1 2 1 1 1。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

2025-03-06 09:40:01 524

原创 加油站力扣--134

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。假设这个中间的数叫做j,0-i之间num1<0,如果j到i之间num2>0的话,那么0到j之间num3<0,到j就停止了根本不可能到i,所以直接是i的下一个数字开始。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。你有一辆油箱容量无限的的汽车,从第。

2025-03-05 10:29:29 302

原创 K次取反后最大化的数组和力扣--1005

所以先排序,然后遍历,如果是负数就取相反数,在for循环中,i<nums.length和k>0的顺序不能换,因为先判断i<nums.length,如果i已经到了最后,那么说明负数都变成了正数,就要对最小的正数进行操作了,如果k>0在前面会报错。思路是把绝对值大的负数变成正数,然后如果都是正数的话,把最小值再变成负数消耗k,这样对结果影响最小。选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2]。选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4]。可以多次选择同一个下标。

2025-03-05 09:36:20 268

原创 跳跃游戏||力扣--45

给定一个长度为n的整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向后跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意i + j < n返回到达的最小跳跃次数。生成的测试用例可以到达。2跳到最后一个位置的最小跳跃数是 2从下标为 0 跳到下标为 1 的位置,跳 1步,然后跳 3步到达数组的最后一个位置。2nums[n-1]

2025-03-05 09:08:41 239

原创 跳跃游戏力扣--55

给你一个非负整数数组 ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 ;否则,返回 。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远

2025-03-04 14:53:05 151

原创 买卖股票的最佳时机II力扣--122

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。最大总利润为 4 + 3 = 7。比如:[7,1,5,3,6,4]

2025-02-27 10:23:33 277

原创 最大子数组和力扣--53

记录和,遍历,一旦和变成负数,他会使得后面要加的那个数字变小,所以思路是一旦和变成负数,就舍弃他们,从下一个数字开始计算。不是遇到负数就舍弃他!,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。连续子数组 [4,-1,2,1] 的和最大,为 6。实时更新最后的结果,哪个大保留哪个。是数组中的一个连续部分。

2025-02-27 09:53:18 310

原创 摆动序列力扣--376

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如,是一个,因为差值是正负交替出现的。可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。给你一个整数数组nums,返回nums中作为的。6整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3)。7这个序列包含几个长度为 7 摆动序列。

2025-02-27 09:29:27 886

原创 分发饼干力扣--455

if 里的 index 指向 胃口 10, for 里的 i 指向饼干 9,因为 饼干 9 满足不了 胃口 10,所以 i 持续向前移动,而 index 走不到。外面的 for 是里的下标 i 是固定移动的,而 if 里面的下标 index 是符合条件才移动的。的逻辑,所以 index 不会移动,那么当 i 持续向前移动,最后所有的饼干都匹配不上。虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。是先遍历的胃口,在遍历的饼干,那么可不可以 先遍历 饼干,在遍历胃口呢?

2025-02-26 09:54:28 257

原创 贪心算法理论基础

做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。如何验证可不可以用贪心算法呢?还有一种方法是数学证明。

2025-02-26 09:20:23 206

原创 全排列II力扣--47

大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。得一直是 true 或者一直是false 才可以,而不是 一会是true 一会又是false。来来来,我就用输入: [1,1,1] 来举一个例子。那如果都可以,直接去掉哪个条件可以吗?给定一个可包含重复数字的序列。返回所有不重复的全排列。这么说是不是有点抽象?

2025-02-25 15:58:00 357

原创 全排序力扣--46

给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以返回答案。

2025-02-25 15:14:29 127

原创 非递减子序列力扣--491

目录题目思路代码给你一个整数数组 ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]示例 2:输入:nums = [4,4,3,2,1]输出:[[4,4]]思路看到的第一反应是先排序,

2025-02-25 14:50:46 221

原创 子集II力扣--90

其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。返回的解集中,子集可以按。

2025-02-24 17:08:10 191

原创 子集力扣--78

返回该数组所有可能的子集(幂集)。

2025-02-24 16:27:55 276

原创 复原IP地址力扣--93

切割的线用startIndex来记录,还需要一个变量pointNum,记录添加逗点的数量。运算符将上述三个部分连接起来,形成一个新的字符串。方法只接受一个参数时,它表示从指定的索引开始截取到字符串的末尾。表示截取的起始索引(包含该索引对应的字符),第二个参数。开始,截取到字符串的末尾,得到一个新的子字符串。表示截取的结束索引(不包含该索引对应的字符)。,用以表示一个 IP 地址,返回所有可能的。类的一个方法,用于截取字符串的一部分。最后,将连接好的新字符串重新赋值给变量。的字符,得到一个新的子字符串。

2025-02-24 10:42:09 410

原创 分割回文串力扣--131

循环中,我们 定义了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。首先判断这个子串是不是回文,如果是回文,就加入在。首先第一个难点是把回文和回溯算法联系在一起。递归函数参数还需要startIndex,中,path用来记录切割过的回文子串。分割成一些子串,使每个子串都是。所有可能的分割方案。

2025-02-20 10:22:56 265

原创 组合总和II力扣--40

对于回溯的参数传递:因为有相同元素,所以需要定义一个used数组,来标记,这个数字是否使用过。要去重的是“同一树层上的使用过”,如何判断同一树层上元素(相同的元素)是否使用过了呢。candidate中的元素可以重复,但是结果中的组合不能重复(此时for循环里就应该做continue的操作。中的每个数字在每个组合中只能使用。首先对数组排序,使得相同的元可以相邻。给定一个候选人编号的集合。解集不能包含重复的组合。中所有可以使数字和为。

2025-02-20 09:14:17 428 1

原创 组合总和力扣--39

本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!和前面的组合问题不同的是,最后的结果集里的数字可以有重复比如target是4,结果集可以是2,2。如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:力扣17。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。如果是一个集合来求组合的话,就需要startIndex,例如:力扣77和216.如果至少一个数字的被选数量不同,则两种组合是不同的。

2025-02-19 10:25:43 315

原创 电话号码的字母组合力扣--17

图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。需要index来记录,比如他是2和3,,需要记录他到2了还是到3了,所以index用来记录到2还是3。例如输入用例"23",两个数字,那么根节点往下递归两层就可以了,叶子节点就是要收集的结果集。

2025-02-19 09:48:33 271

原创 力扣216--组合总和III

在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。该列表不能包含相同的组合两次,组合可以以任何顺序返回。所有可能的有效组合的列表。没有其他符合的组合了。没有其他符合的组合了。

2025-02-17 17:41:56 308

原创 力扣77--组合

给定两个整数n和k,返回范围[1, n]中所有可能的k个数的组合。你可以按返回答案。

2025-02-17 11:09:05 644

python基础知识思维导图

python基础知识思维导图

2024-05-08

python基础知识思维导图

python基础知识思维导图

2024-05-08

python基础笔记大学

python基础笔记

2024-04-09

空空如也

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

TA关注的人

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