自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(236)
  • 问答 (1)
  • 收藏
  • 关注

原创 【划分型DP】力扣2008. 出租车的最大盈利

乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。输入:n = 20, rides = [[1,6,1],[3,10,2],[10,12,3],[11,12,2],[12,15,2],[13,18,1]],其中 m 是 rides 的长度,n 是地点数目。输入:n = 5, rides = [[2,5,4],[1,5,1]]

2024-11-26 18:52:00 303

原创 【划分型DP】力扣2830. 销售利润最大化

我们可以以某个offer的end为索引储存到数组group中,储存的是start和gold数据,也就是offer[0]和offer[2]。将位于 [0,0] 范围内的房屋以 1 金币的价格出售给第 1 位买家,并将位于 [1,3] 范围内的房屋以 2 金币的价格出售给第 3 位买家。输入:n = 5, offers = [[0,0,1],[0,2,10],[1,3,2]]输入:n = 5, offers = [[0,0,1],[0,2,2],[1,3,2]]返回你可以赚取的金币的最大数目。

2024-11-26 17:58:58 242

原创 【数据结构-队列】力扣2810. 故障键盘

我们可以发现,反转可以看作改变添加字符的方向,所以我们定义一个双端队列que和一个用来判断方向的k,一旦遇到i就令k取反,然后来判断要从前面加入元素还是后面加入元素,最后根据k的方向来从前往后或者从后往前来输出双端队列的字符,储存在res中。,其中 n 是字符串 s 的长度。,即为双端队列需要使用的空间。

2024-11-25 22:08:07 190

原创 【数据结构-队列】力扣1670. 设计前中后队列

从 [1, 2, 3, 4, 5, 6] 的中间位置弹出元素,返回 3 ,数组变为 [1, 2, 4, 5, 6]。int popMiddle() 将 正中间 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1。将 6 添加到 [1, 2, 3, 4, 5] 的中间位置,结果数组为 [1, 2, 6, 3, 4, 5]。int popFront() 将 最前面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1。// 返回 1 -> [4, 3, 2]

2024-11-25 20:54:55 190

原创 【数据结构-队列】力扣641. 设计循环双端队列

需要注意的是,在题解中,rear指向的是插入的位置,而front指向的是队列头元素的位置,所以在插入队头元素的时候要先移动front再插入,而插入队尾元素的时候先插入再移动rear。如果操作成功返回 true ,否则返回 false。boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false。boolean isFull() :若双端队列满了,则返回 true ,否则返回 false。int getFront() ):从双端队列头部获得一个元素。

2024-11-25 19:01:21 843

原创 【数据结构-队列】力扣622. 设计循环队列

在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。// 返回 false,队列已满。enQueue(value): 向循环队列插入一个元素。// 返回 true。// 返回 true。// 返回 true。// 返回 true。// 返回 true。MyCircularQueue(k): 构造器,设置队列长度为 k。deQueue(): 从循环队列中删除一个元素。// 返回 true。如果队列为空,返回 -1。

2024-11-25 02:15:39 676

原创 【数据结构-队列】力扣232. 用栈实现队列

而在这一题栈模拟队列中,如果使用那种做法会发现我们没办法将栈元素的排列顺序和队列类似,所以我们就只需要按栈的顺序来排列元素,然后我们在pop的时候,将栈底的元素弹出就行。那么要将栈底的元素弹出,我们就需要另外一个栈st2来辅助,我们将栈st1的元素全部推入st2中,然后st1的栈底元素就在st2的栈顶,将st2栈顶的元素pop并返回后,再将st2的元素推入st1中,这时候就可以实现st1栈底元素被pop掉。假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

2024-11-23 14:51:21 440

原创 【数据结构-队列】力扣225. 用队列实现栈

栈是后进先出,队列是先进先出,所以我们需要做的就是将最后进入的元素能够放在队列的前面,由于队列是从后面推入元素,所以我们就将要推入的元素先放到队列q2中,然后再将q1的元素推入到q2,这时候要推入的元素就在队列的最前面,如果pop的话就会先pop出最后进入的元素。然后我们swap队列q1和q2,这样才能够不断循环,以队列q1为主要模拟栈,队列q2是用来辅助的。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。// 返回 False。

2024-11-23 14:08:46 288

原创 【数据结构-队列】力扣950. 按递增顺序显示卡牌

我们得到的牌组顺序为 [17,13,11,2,3,5,7](这个顺序不重要),然后将其重新排序。我们得到的牌组顺序为 [17,13,11,2,3,5,7](这个顺序不重要),然后将其重新排序。重新排序后,牌组以 [2,13,3,11,5,17,7] 开始,其中 2 位于牌组的顶部。重新排序后,牌组以 [2,13,3,11,5,17,7] 开始,其中 2 位于牌组的顶部。牌组现在是 [3,11,5,17,7,13]。牌组现在是 [3,11,5,17,7,13]。牌组现在是 [5,17,7,13,11]。

2024-11-22 17:47:07 372

原创 【数据结构-队列】力扣933. 最近的请求次数

确切地说,返回在 [t-3000, t] 内发生的请求数。// requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3。可以使用队列的方法,每次ping首先先记录当前请求到队列中,然后由于t是逐渐增大的,所以我们只需要将小于t-3000的t给弹出,然后返回队列q的大小即可。// requests = [1, 100, 3001],范围是 [1,3001],返回 3。// requests = [1],范围是 [-2999,1],返回 1。

2024-11-21 00:25:04 279

原创 【数据结构-表达式解析】力扣227. 基本计算器 II

那么当我们遍历3的时候,会被储存在num中,当遇到加号的时候,就会将num给push到栈中,然后将preSign更新为加号,然后遍历到5,记录到num中,然后空格跳过,接下来遇到除号,我们这时候不进行除号运算,而是进行前面preSign的运算,preSign是加号,也就是继续将5推入栈中,运算完后将preSign更新为除号,然后遍历2,记录num=2,这时候经过while循环的i++,此时i=n,触发了if判断,此时preSign为除号,将栈顶的5除以当前的num值2。输入:s = " 3/2 "

2024-11-20 19:53:33 513

原创 【数据结构-表达式解析】【hard】力扣224. 基本计算器

所以我们可以构建一个栈st来储存符号,我们初始化符号sign(1或-1)为1,当我们遍历字符串的时候,遇到左括号,就往栈中推入sign,推入的sign会位于栈顶,作用于这个左括号开始到右括号结束之间的符号,假设我们这时候sign是-1,然后遇到了一个左括号,然后接着在这个括号范围内遇到了一个减号,那么他就将sign变为1,也就是我们所说的负负得正,接着当我们遇到右括号的时候,就弹出栈顶的sign,因为栈顶的sign只作用于这个括号范围。输入:s = “(1+(4+5+2)-3)+(6+8)”

2024-11-20 17:36:32 393

原创 【数据结构-表达式解析】力扣1006. 笨阶乘

例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。相反,我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。这保证结果是一个整数。解释:12 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。

2024-11-20 02:20:56 228

原创 【数据结构-表达式解析】力扣150. 逆波兰表达式求值

输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )。解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。输入:tokens = [“4”,“13”,“5”,“/”,“+”]输入:tokens = [“2”,“1”,“+”,“3”,“*”]用栈可以完美模拟逆波兰表达式,过程较简单,不多解释。

2024-11-19 19:11:50 235

原创 【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

想象我们有一个指针m,他的作用是在m处作为状态转移的位置,于是我们可以由f[m][j-1]也就是从m-1下标开始及之前分割成j-1个回文串需要的最少修改字符数,然后加上cost[m][i-1]也就是f[i][j]。然后我们定义一个二维数组f[i][j],用 f[i][j] 表示对于字符串 S 的前 i 个字符,将它分割成 j 个非空且不相交的回文串,最少需要修改的字符数。我们遍历数组,然后内层循环j,当j=1的时候,说明不分割,所以f[i][1] = cost[0][i-1]。s 中只含有小写英文字母。

2024-11-19 13:48:43 770

原创 【划分型DP-约束划分个数】力扣813. 最大平均值和的分组

因为由于我们状态进行了压缩,所以f[x]里面实际上保存的信息是上一轮的数据,如果我们i使用正序去遍历,那么f[i]就会覆盖掉f[x]的数据,导致在状态转移的过程中,无法读取到上一轮的f[x]的数据。,也就是说,我们枚举i后,从j-1到i-1的范围内枚举x,这样子f[i][j]就可以由f[x][j-1]加上第x个元素到第i个元素的平均值转移而来。nums 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + 3) / 3 + 9 = 20.输出: 20.00000。

2024-11-18 23:04:37 455

原创 【划分型DP-约束划分个数】【hard】力扣1745. 分割回文串 IV

我们预处理完字符串后,我们可以观察题目是是否能分割成三个非空回文子字符串,所以我们只需要枚举中间的范围,然后从开头0到i-1就是第一个范围,从j+1到n-1就是第三个范围。给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false。首先要做的是预处理,看字符串中哪些范围是回文串,然后我们将它记录到数组f中。解释:“abcbdd” = “a” + “bcb” + “dd”,三个子字符串都是回文的。如果遍历完后还没有返回true,那么就返回false。

2024-11-18 01:00:41 790

原创 【划分型DP-约束划分个数】力扣1043. 分隔数组以得到最大和

我们在推到f[i]的时候,我们可以从i开始枚举j,来枚举分割的区间,然后我们可以通过。倒序遍历 j 的过程中可以顺便维护区间最大值,这样 d[i] 的转移可以在 O(k) 的时间内完成。来求出[j,i]的最大和是多少,因为这时候j小于i,所以我们也知道f[j]是多少,这时候我们可以状态转移。输入:arr = [1,4,1,5,7,3,6,1,9,9,3], k = 4。输入:arr = [1,15,7,9,2,5,10], k = 3。解释:数组变为 [15,15,15,9,10,10,10]

2024-11-16 22:45:03 219

原创 【划分型DP-约束划分个数】【hard】力扣410. 分割数组的最大值

这道题的目的就是要找出连续子数组的最大值,那么我们可以思考,我们是不是可以假设一个最大值,然后看一下如果要让子数组分割的最大值不超过假定的最大值,那么要分割几次。一旦分割的次数小于等于题目要求的k的话,那么就说明假定的最大值大于等于实际的最大值,那么就让right = mid,这样才可以让接下来假定的最大值变小。给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组,使得这 k 个子数组各自和的最大值 最小。输入:nums = [1,2,3,4,5], k = 2。

2024-11-13 22:27:06 354

原创 【划分型DP-最优划分】力扣LCR 165. 解密数字

这道题和将字母翻译为数字的逻辑一样,我们只需要定义dp[i]为前i个字符组成的字符串所能解密的字母个数。然后我们开始遍历i,以第i个字符和第i-1个字符进行讨论,当curNum是0-5之间的时候,并且lastNum是1或2,我们可以将他们两个数字转化为一个字符。解释: 216612 解密后有 6 种不同的形式,分别是 “cbggbc”,“vggbc”,“vggm”,“cbggm”,“cqgbc” 和 “cqgm”如果curNum是其他数字,那么只有当lastNum为1的时候,这两个数字才能转化为一个字母。

2024-11-12 23:04:59 286

原创 【划分型DP-最优划分】【hard】力扣639. 解码方法 II

解释:这一条编码消息可以表示 “11”、“12”、“13”、“14”、“15”、“16”、“17”、“18” 或 “19” 中的任意一条。解释:这一条编码消息可以表示 “21”、“22”、“23”、“24”、“25”、“26”、“27”、“28” 或 “29” 中的任意一条。解释:这一条编码消息可以表示 “1”、“2”、“3”、“4”、“5”、“6”、“7”、“8” 或 “9” 中的任意一条。可以分别解码成字符串 “A”、“B”、“C”、“D”、“E”、“F”、“G”、“H” 和 “I”。

2024-11-12 19:49:53 224

原创 【划分型DP-最优划分】力扣91. 解码方法

初始化dp[0] = 1,这是我们边界条件的处理,我们可以想象i=2,只有两个字符的时候,如果我们将这两个字符作为一种解码方式,那么此时dp[2]由dp[0]状态转移而来,所以我们可以认为dp[0]应当初始化为1。我们定义dp[i]为前 i 个字符的解码方式数量,而dp[i]可以由dp[i-1]也可以由dp[i-2]状态转移而来,当我们将最后一个字符作为一个解码方法的时候,这时候由dp[i-1]转移而来,当把后两个字符作为一个解码方法,由dp[i-2]转移而来。输入:s = “12”输入:s = “06”

2024-11-12 09:07:37 237

原创 【划分型DP-最优划分】力扣2767. 将字符串分割为最少的美丽子字符串

最重要的是回溯的思路,我们定义dfs(i)的含义是从第i个字符后的字符串被分割成最少的美丽子字符串的个数,所以我们可以思考,我们从第0个字符开始,举个例子,如果找到了一个5的二进制表示101,那么也就是说,在这个回溯中,我们dfs(0)也就是dfs(3)+1,然后dfs(3)会继续往上回溯。那么既然使用了回溯,就要知道在回溯的末端我们该如何处理,在回溯末端我们刚好可以分割完字符串为美丽数组,那么就返回0,也就代表这个回溯的过程是可行的。解释:我们可以将输入字符串分成 [“1”, “1”, “1”]。

2024-11-11 22:41:19 225

原创 【划分型 DP-最优划分】力扣2707. 字符串中的额外字符

我们倒序遍历,在每一次遍历的开始,我们需要初始化dp[i],dp[i]的初始值可以由dp[i+1]+1状态转移而来。的含义是我们从s[i]开始的长度为word.size()的字符串是否和字典的单词匹配,如果匹配的话,并且dp[i+word.size()]小于dp[i],就更新dp[i]为dp[i+word.size()]。解释:将 s 分成两个子字符串:下标从 0 到 3 的 “leet” 和下标从 5 到 8 的 “code”。最后返回dp[0],代表从字符串s的最少未匹配字符。

2024-11-09 17:10:13 398

原创 【划分型 DP-最优划分】【腾讯笔试压轴】【hard】力扣132. 分割回文串 II

我们定义一个二维数组g[i][j]来表示字符串[i…在处理回文串的时候,需要注意我们要初始化g[i][j]都为true,这是为了避免额外判断:若初始化为 false,则需要额外处理长度为 1 或 2 的子串,代码的复杂度会增加。因为我们最终的目的就是求从0到(n-1)的字符串的最小分割次数,那么我们求0到j的最小分割次数就可以从前面的状态转换而来。我们这时候遍历下标i,目的是判断从i+1到j这字符串是否是回文,如果是回文的话,那么从0到j这个字符串的最小分割次数,不就是0到i的最小分割次数加上1吗。

2024-11-08 23:03:10 382

原创 【划分型 DP】力扣139. 单词拆分

我们首先在外层循环遍历i,代表着遍历字符串,然后内层循环j的作用是来判断该字符串前j个字符组成的字符串能否被拆分成字典里的单词,并且判断第j+1个字符后的单词是否在字典里。输入: s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”]解释: 返回 true 因为 “applepenapple” 可以由 “apple” “pen” “apple” 拼接成。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

2024-11-08 01:36:32 342

原创 【动态规划-划分型 DP】力扣2369. 检查数组是否存在有效划分

我们在遍历过程中,一旦发现此时最近的几个元素,能够满足三种有效划分情况的一种,我们根据在这几个元素之前是否也存在有效划分,如果存在,那么说明目前至少存在一种有效划分。通过对未压缩代码观察,我们发现我们在动态规划状态转移过程中,最多只用到当前元素和前面两个元素,那么说明我们可以用三个变量来储存这些状态,然后在遍历nums的过程中不断覆盖滚动。例如,子数组 [3,4,5] ,但是子数组 [1,3,5] 不符合要求。子数组 恰 由 3 个相等元素组成,例如,子数组 [4,4,4]。解释:该数组不存在有效划分。

2024-11-07 17:47:43 407

原创 【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号

首先为什么我们要向栈中推入一个-1,实际上这代表着从字符串第0个字符开始计数,然后当发现右括号找不到左括号,也就是栈st为空的时候,就将右括号坐标i填入到栈中,代表着从第i+1个元素开始计数。给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。栈的大小在最坏情况下会达到 n,因此空间复杂度为 O(n)。,n 是给定字符串的长度。解释:最长有效括号子串是 “()()”解释:最长有效括号子串是 “()”输入:s = “)()())”输入:s = “(()”

2024-11-07 14:57:11 238

原创 【数据结构-合法括号字符串】力扣678. 有效的括号字符串

遍历完字符串了以后,可能会存在还有未匹配的左括号,我们要做的就是将他与星号进行匹配,那么我们就记录栈顶元素,也就是他们各自的索引,由于星号这时候充当的是变成右括号,那么星号的索引必定要大于左括号才可以,如果st1的栈顶索引大于st2的栈顶索引,那么就会返回false,因为这时候找不到一个星号和这个左括号进行匹配。当我们遍历到左括号或者星号的时候,我们就将他的索引推入栈中,当我们遍历到右括号的时候,我们优先将他与左括号进行匹配,没有左括号我们才用星号去匹配。任何右括号 ‘)’ 必须有相应的左括号 ‘(’。

2024-11-06 22:59:24 377

原创 搞懂c#的委托与事件

调用 Interlocked.CompareExchange(ref _myEvent, updated, original),尝试将 _myEvent 更新为 updated,但前提是 _myEvent 的当前值没有被其他线程修改(即 _myEvent 仍等于 original)。适用于返回类型的委托,例如 Func。3.因为是数组,所以remove(-=)的复杂度是O(n),remove的时候,从后往前遍历。我们无法保证委托一定不是空的,委托如果是空的,在运行的时候会报错,我们可以采用。

2024-11-05 19:58:59 1417

原创 【数据结构-合法括号字符串】力扣1963. 使字符串平衡的最小交换次数

把匹配的全都消了,剩下的必然是 k 个 ] 加 k 个 [,k 为偶数时,交换 k/2 次就能组成 k/2 个 [],k 为奇数时,把左右两端交换后剩下 k-1 个 ] 加 k-1 个 [,再按照偶数来算,最后交换 1 + (k-1)/ 2 次组成 [[][]…解释:交换下标 0 和下标 3 对应的括号,可以使字符串变成平衡字符串。字符串可以写成 [C] ,其中 C 是一个 平衡字符串。最终字符串变成 “[[]]”。输入:s = “]]][[[”输入:s = “][][”输入:s = “[]”

2024-11-05 17:18:59 297

原创 【数据结构-合法括号字符串】力扣1249. 移除无效的括号

这道题的思路就是,我们构造一个新的字符串str,用left来记录未匹配的左括号的数量,然后遍历s,只要遍历到左括号,就推入str中,然后left++,遍历到右括号,如果left大于0,则推入str中,令left–。这样子构造出的字符串str,可能会出现在字符串的右边,可能会有未匹配的左括号存在,所以我们从右往左遍历字符串str,删除掉多余的left即可。解释:“lee(t(co)de)” , “lee(t©ode)” 也是一个可行答案。可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」

2024-11-05 17:04:54 137

原创 【数据结构-合法括号字符串】力扣856. 括号的分数

由于一个左括号对应一个右括号,那么我们在遍历字符串s的时候,如果遍历到左括号,那么就往栈中推入0,当推入右括号的时候,匹配对应的左括号,当这对括号是深度最深的括号的时候,那么他们的分数就是1,否则就将分数乘以2,加到浅一层深度的左括号中。我们通过这种方法,可以找到从左往右第二个左括号和第一个右括号形成一个括号对,然后深度是1,最终他贡献的分数就是2,然后从左往右第四个左括号和他右边的右括号形成一个括号对,深度是2,最终他贡献的分数就是4。举个例子:输入: “(()(()))”输入: “(()(()))”

2024-11-05 16:41:57 218

原创 【数据结构-合法括号字符串】【华为笔试题】力扣1190. 反转每对括号间的子串

让我们来模拟,当遍历s到第一个左括号的时候,他根据pair记录,查找到最外层有括号位置,然后遍历方向改变成向左,这时候遇到i,ret = “i”,然后遍历到内层有括号,索引转换到最内层左括号,方向向右,这时候一一推入’l’,‘o’,‘v’,‘e’,此时ret = “ilove”,然后遇到内层有括号,他根据pair将索引转换到内层左括号,方向向左,然后加入元素’u’,此时ret就是"iloveu"。预处理出括号的对应关系的序列的时间复杂度为 O(n),遍历字符串的时间复杂度同样为 O(n)。

2024-11-05 00:49:55 539

原创 【数据结构-合法括号字符串】力扣1614. 括号的最大嵌套深度

这道题很简单,我们用left来记录左括号的数量,然后每当遍历到一个右括号,就会匹配一个左括号,然后令未匹配的左括号数量–,我们通过res来记录未匹配左括号的最多的数量,res即是括号的最大嵌套深度。嵌套深度是嵌套括号的 最大 数量。s 由数字 0-9 和字符 ‘+’、‘-’、‘*’、‘/’、‘(’、‘)’ 组成。输入:s = “(1+(2*3)+((8)/4))+1”输入:s = “(1)+((2))+(((3)))”输入:s = “()(())((()()))”解释:数字 3 在嵌套的 3 层括号中。

2024-11-03 15:29:19 294

原创 【数据结构-合法括号字符串】力扣1021. 删除最外层的括号

输入字符串为 “(()())(())(()(()))”,原语化分解得到 “(()())” + “(())” + “(()(()))”,删除每个部分中的最外层括号后得到 “()()” + “()” + “()(())” = “()()()()(())”。输入字符串为 “(()())(())”,原语化分解得到 “(()())” + “(())”,例如,“”,“()”,“(())()” 和 “(()(()))” 都是有效的括号字符串。输入:s = “(()())(())(()(()))”输出:“()()()”

2024-11-01 23:52:26 355

原创 【数据结构-合法括号字符串】力扣921. 使括号有效的最少添加

我们可以通过一个变量leftCount来记录未匹配左括号的个数,当遍历到左括号的时候,令leftCount++,当遍历到的元素是右括号的时候,如果在他左边有未匹配的左括号,则令他们匹配,然后leftCount–,否则右括号没有被匹配,我们将未匹配的右括号个数加入到ans中。最后遍历完后,我们需要添加括号的次数就是未匹配的左括号次数加上未匹配的右括号次数。例如,如果 s = “()))” ,你可以插入一个左括号变成 “(()))”,或者插入一个右括号变成 “())))”。输入:s = “())”

2024-11-01 18:32:05 339

原创 【数据结构-合法括号字符串】力扣20. 有效的括号

我们可以采用模拟栈,定义一个数组st,我们开始遍历数组s,如果遍历的元素是左括号,那么就直接推入栈中,如果推入的是右括号,我们就看栈顶是否是对应的左括号,如果不对应的话,可以直接说明这个字符串是无效的。如果对应的话,就删除他们,对应操作是弹出栈顶元素,当我们遍历完字符串s,如果里面的括号都一一对应,那么最后栈将会是空的,如果st中还存在元素,则说明字符串s是无效字符串。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。输入:s = “()[]{}”

2024-11-01 17:47:12 288

原创 【数据结构-邻项消除】力扣1717. 删除子字符串的最大得分

该while是贪心的思想的核心,我们因为已经假设ab的得分较大,那么当遍历字符是a的时候,我们直接记录a的数量,当字符是b的时候,并且在该部分字符串中,依旧存在a,那么他们就最终能构成字符串"ab"。我们记录完删除"ab"得到的得分后,还要记录删除"ba"得到的得分,这取决于在删除完"ab"操作后,剩余的a和b的数量的较小值乘以y。然后再定义一个栈st2,遍历处理过一遍的字符串st1,遍历里面的字符,逐一删除掉较小的分的字符串,并加上相应的得分。首先核心思路不变,先删除得分较大的字符串。

2024-11-01 01:52:11 446

原创 【数据结构-邻项消除】力扣735. 小行星碰撞

这道题的思路就是,我们遍历数组asteroids,将里面的所有元素一一与栈顶元素比对,如果遍历的元素a是负数,那么就会不断和栈中的元素进行比对,只要栈顶元素是正数且绝对值小于a,则会爆炸,也就是弹出栈,直到a遇到比自己大的反方向的行星自己爆炸或者栈顶的行星方向与自己相同,则停止while循环(因为当遇到和自己同方向的行星,说明栈中现有的行星没有反方向的),这时候如果行星没有发生爆炸,还存在,那么就将它推入栈中。碰撞规则:两个小行星相互碰撞,较小的小行星会爆炸。解释:2 和 -5 发生碰撞后剩下 -5。

2024-10-31 17:38:31 396

空空如也

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

TA关注的人

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