- 博客(63)
- 收藏
- 关注
原创 Practices11|41. 缺失的第一个正数(数组)、73. 矩阵置零(矩阵)
但我们可以继续利用上面的提到的性质:由于我们只在意 [1,N]中的数,因此我们可以先对数组进行遍历,把不在 [1,N]范围内的数修改成任意一个大于 N的数(例如 N+1)。对数组进行遍历,对于遍历到的数 x,如果它在 [1,N]的范围内,那么就将数组中的第 x−1个位置(注意:数组下标从 0开始)打上「标记」。我们遍历数组中的每一个数 x,它可能已经被打了标记,因此原本对应的数为 ∣x∣,如果 ∣x∣∈[1,N],那么我们给数组中的第 ∣x∣−1个位置的数添加一个负号。的矩阵,如果一个元素为。
2023-08-17 16:24:11
531
原创 Practices10(数组)|238. 除自身以外数组的乘积、189. 轮转数组(做过)、56. 合并区间(做过)
/当前数除自身以外数组的乘积=当前数左边的乘积*当前数右边的乘积。//用两个数组来记录前缀元素的乘积和后缀数组的乘积。之中任意元素的全部前缀元素和后缀的乘积都在。时间复杂度内完成此题。之外其余各元素的乘积。
2023-08-15 18:07:05
324
原创 Practices9(双指针)|283. 移动零、11. 盛最多水的容器、15. 三数之和
双指针左指针的左面全是不为零的数,右指针去寻找,找到不为零的和左指针交换,做指针加加,右指针继续寻找,直到找到数组长度的尾巴。因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。若向内 移动短板 ,水槽的短板 可能变大,因此下个水槽的面积 可能增大。若向内 移动长板 ,水槽的短板不变或变小,因此下个水槽的面积 一定变小。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。移动到数组的末尾,同时保持非零元素的相对顺序。注意,输出的顺序和三元组的顺序并不重要。
2023-08-11 17:30:35
449
原创 Practices8(双指针)|925. 长按键入、844. 比较含退格的字符串
双指针--从后向前统计两个字符串的# 并模拟删除操作(长度减一)得到没有退格符的字符串,从后向前统计字符串的每一位是否相等,相等返回true。当 name[i]=typed[j]时,说明两个字符串存在一对匹配的字符,此时将i,j 都加 1。否则,如果 typed[j]=typed[j−1],说明存在一次长按键入,此时只将 j 加 1。最后,如果 i=name.length,说明 name的每个字符都被「匹配」了。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回。
2023-08-10 17:18:38
204
原创 Practices7|128. 最长连续序列、49. 字母异位词分组(hash)
要求,每个元素遍历使用一遍。判断连续:前一个不存在的元素作为起始元素,然后看是否存在下一个元素,存在更新最长连续的长度。排序之后的字符 或者计数后的字符串 (字母异位词键一定是相同的) 值:也是返回的字母异位词。,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。是由重新排列源单词的所有字母得到的一个新单词。可以按任意顺序返回结果列表。可能会有重复元素,用set去重。给你一个字符串数组,请你将。给定一个未排序的整数数组。字母 统计频率 hash。两种方法:排序 和 计数。
2023-08-10 17:00:20
224
原创 Practices6|69. x 的平方根、(哈希表)205. 同构字符串、(哈希表)1002. 查找共用字符
给你一个非负整数x,计算并返回x的。由于返回类型是整数,结果只保留,小数部分将被不允许使用任何内置指数函数和算符,例如或者x ** 0.5。x = 42x = 828 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
2023-08-05 13:32:57
706
原创 Practice5|58. 最后一个单词的长度、66. 加一
给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。示例 1:5最后一个单词是“World”,长度为5。示例 2:4最后一个单词是“moon”,长度为4。
2023-08-05 13:18:49
110
原创 Practice4|14. 最长公共前缀、2. 两数相加
结论:查找字符串数组中的最长公共前缀的方法,依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。如果在尚未遍历完所有的字符串时,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此不需要继续遍历剩下的字符串,直接返回空串即可。的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。编写一个函数来查找字符串数组中的最长公共前缀。要考虑进位(同时添加头指针方便操作)如果不存在公共前缀,返回空字符串。
2023-08-05 13:10:51
208
原创 Practice3|922. 按奇偶排序数组 II、143. 重排链表
4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。把链表放入双端队列,双端队列一前一后弹出数据来构造新队列。奇偶数组分开统计再合并到原有数组。任何满足上述条件的数组作为答案。对数组进行排序,以便当。给定一个非负整数数组。
2023-07-31 17:36:43
299
原创 Practice2|189. 轮转数组、724. 寻找数组的中心下标
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,输入: nums = [1,2,3,4,5,6,7], k = 3。输入:nums = [-1,-100,3,99], k = 2。输入:nums = [1, 7, 3, 6, 5, 6]向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]输出: [5,6,7,1,2,3,4]
2023-07-29 12:08:09
230
原创 Practice1|1207. 独一无二的出现次数、1365. 有多少小于当前数字的数字、941. 有效的山脉数组
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。输入:arr = [1,2,2,1,1,3]输入:nums = [8,1,2,2,3]输入:nums = [7,7,7,7]
2023-07-27 12:36:59
491
1
原创 Day60|84.柱状图中最大的矩形
如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 8 进行比较,周而复始,那么计算的最后结果resutl就是0。那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。开头为什么要加元素0?
2023-07-22 15:36:08
69
原创 Day59|503.下一个更大元素II 、42. 接雨水 (高频)
一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。此时的栈顶元素st.top(),就是凹槽的左边位置,下标为st.top(),对应的高度为height[st.top()](就是图中的高度2)。取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid](就是图中的高度1)。如果添加第二个5的时候就应该将第一个5的下标弹出,把第二个5添加到栈中。
2023-07-21 11:04:04
87
原创 Day58|739. 每日温度 、 496.下一个更大元素 I
题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。
2023-07-20 11:56:20
107
原创 Day57|647. 回文子串 、516.最长回文子序列
1.题目:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:s = "abc"输出:3解释:三个回文子串: "a", "b", "c"示例 2:输入:s = "aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"2.思路:动规五部曲:1.确定dp
2023-07-19 11:10:24
209
原创 Day56|583. 两个字符串的删除操作 、72. 编辑距离
那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
2023-07-18 16:33:09
123
原创 Day55|392.判断子序列 、 115.不同的子序列
t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];其实这里 大家可以发现和。
2023-07-17 14:26:01
79
原创 Day53| 1143.最长公共子序列、1035.不相交的线 、 53. 最大子序和 动态规划
而是dp[6]。在回顾一下dp[i]的定义:包括下标i之前的最大连续子序列和为dp[i]。那么我们要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列。所以在递推公式的时候,可以直接选出最大的dp[i]。
2023-07-15 16:21:28
519
原创 Day52| 300.最长递增子序列 、 674. 最长连续递增序列 、718. 最长重复子数组
为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如何算递增呢。
2023-07-14 19:19:30
164
原创 Day51|309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费
如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么大家感受一下 dp[0][1] (即第0天的状态二)应该初始成多少,只能初始为0。那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);今天卖出了股票(状态三),同上分析,dp[0][2]初始化为0,dp[0][3]也初始为0。
2023-07-13 15:50:17
125
原创 Day50|123. 买卖股票的最佳时机 III、188.买卖股票的最佳时机IV
123.买卖股票的最佳时机III1.题目:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入:prices = [3,3,5,0,0,3,1,4]输出:6解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。
2023-07-12 23:35:13
91
原创 Day49|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
由递推公式 dp[i][0] = max(dp[i - 1][0], -prices[i]);和 dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);同时,你不能在买入前卖出股票。
2023-07-11 09:49:41
196
原创 Day48|198.打家劫舍、 213.打家劫舍II 、 337.打家劫舍III
1.题目:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2
2023-07-10 11:04:57
70
原创 Day46|139.单词拆分 、多重背包理论基础、背包问题总结
几种常见的背包,其关系如下:通过这个图,可以很清晰分清这几种常见背包之间的关系。五部动规确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。
2023-07-08 16:20:12
138
原创 Day45|70. 爬楼梯 (进阶)、 322. 零钱兑换 、279.完全平方数
凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。本题呢,dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]每次你可以爬 1 或 2 个台阶。
2023-07-08 15:05:14
95
原创 Day44|完全背包、 518. 零钱兑换 II 、 377. 组合总和 Ⅳ
首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。第i件物品的重量是weight[i],得到的价值是value[i]。给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。所以递推公式:dp[j] += dp[j - coins[i]];dp[j]:凑成总金额j的货币组合数为dp[j]
2023-07-06 14:54:41
54
原创 Day43|1049. 最后一块石头的重量 II 、494. 目标和 、 474.一和零 (动态规划,背包问题)
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量。如果没有石头剩下,就返回 0。
2023-07-05 15:33:25
29
原创 Day42|01背包问题,你该了解这些、01背包问题,你该了解这些! 滚动数组 、 416. 分割等和子集
在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。
2023-07-04 21:03:58
86
原创 Day41|343. 整数拆分 96.不同的二叉搜索树
从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。
2023-07-03 11:36:15
81
原创 Day39|62.不同路径 、 63. 不同路径 II
从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
2023-07-01 10:25:26
291
原创 Day38|动态规划理论基础、509. 斐波那契数、70. 爬楼梯 、746. 使用最小花费爬楼梯
英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。首先明确状态转移公式(递推公式),但动规还不仅仅只有递推公式。对于动态规划问题,遵循如下五步曲1.题目:斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F
2023-06-30 14:30:28
80
原创 力扣刷题笔记day37|738.单调递增的数字
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。最后代码实现的时候,也需要一些技巧,例如用一个start来标记从哪里开始赋值9。给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增。想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。
2023-06-30 11:58:04
28
原创 力扣刷题笔记36|435. 无重叠区间 、763.划分字母区间 、56. 合并区间
给你一个字符串 s。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输入: intervals = [[1,2],[2,3],[3,4],[1,3]]输入: intervals = [ [1,2], [1,2], [1,2] ]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。输入:intervals = [[1,4],[4,5]]输出:[[1,6],[8,10],[15,18]]
2023-06-28 23:41:52
57
原创 力扣刷题笔记35|860.柠檬水找零 、406.根据身高重建队列、452. 用最少数量的箭引爆气球
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。输入:points = [[10,16],[2,8],[1,6],[7,12]]第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。需要维护三种金额的数量,5,10和20。
2023-06-27 15:12:04
54
原创 力扣刷题笔记34|1005.K次取反后最大化的数组和 、134. 加油站、135. 分发糖果
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。如果i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。//(i,i+1)上的数要么(-,-);综上只要i添加负号以后的值大于i+1位置上的,我们就改成到i+1位置上去添加负号。//第三种情况,i位置边负,肯定小于i+1位置,i不变。
2023-06-26 18:51:07
41
原创 力扣刷题笔记32|122.买卖股票的最佳时机II、 55. 跳跃游戏 、45.跳跃游戏II
1.题目:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。示例 1:输入:prices = [7,1,5,3,6,4]输出:7解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。 随后,在第 4 天(股票价格
2023-06-24 14:46:56
75
原创 力扣刷题笔记31|455.分发饼干、376. 摆动序列、 53. 最大子序和
相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
2023-06-23 14:37:16
50
原创 力扣刷题笔记30|51. N皇后 、37. 解数独
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。解释:如上图所示,4 皇后问题存在两个不同的解法。
2023-06-22 11:30:59
62
原创 力扣刷题笔记29| 491.递增子序列、 46.全排列、47.全排列 II
去重: 同一层去重,同时每次递归还要去重,通过used数据记录path数组里的元素是否使用过。每次递归还要去重,通过used数据记录path数组里的元素是否使用过。递增子序列中 至少有两个元素。数组中可能含有重复元素。
2023-06-21 11:04:37
41
原创 力扣刷题笔记28|93.复原IP地址 、78.子集 、90.子集II
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。输出:["255.255.11.135","255.255.111.35"]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
2023-06-20 11:28:43
29
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人