- 博客(38)
- 收藏
- 关注
原创 effective c++
int a = 2;注意区分初始化和赋值,C++规定对象的成员变量初始化动作发生在进入构造函数本体之前。可以使用member initialization list(初始化列表)来进行初始化,避免赋值。如何解决这个问题?将non-local static 对象搬到自己的专属函数内(该对象在此函数内被声明为static),这些函数返回一个reference 指向它所含的对象。也就是说将local static对象替换non-local static 对象。
2023-06-19 20:31:57
172
原创 Day50 01背包问题(一维dp数组)LeetCode416. 分割等和子集
如果装该物品,则背包容量= g(10-6) = g(4) + 9 ,也就是 g(10) = g(4) + 6 ,这里的6显然就是新进来的物品的价值,g(10)就是新记录的,对应二维数组里下一层的值,而这里的g(4)是对应二维数组里上一层的值,通俗的来讲:你要找到上一层也就是上一状态下 背包容量为4时的能装的最大价值,用它来更新下一层的这一状态,也就是加入了价值为9的物品的新状态。将二维dp数组压缩成一维dp数组:dp[j]表示容量为j的背包,所背的物品价值可以最大为dp[j]。即将进来的物品重量为6。
2023-05-24 22:38:55
184
原创 Day42 背包问题之01背包问题
放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。不放物品i:dp[i][j] 由dp[i - 1][j]推出,即背包容量为j,里面不放物品i,从下标0到i - 1 的物品里任意选得到的最大价值,此时dp[i][j]就是dp[i - 1][j]。
2023-05-16 22:18:48
171
原创 Day41 LeetCode 343. 整数拆分 96. 不同的二叉搜索树
举例:求dp[3] = dp[0]*dp[2] + dp[1]*dp[1] + dp[2]*dp[0],以1为根节点,其左子树节点个数为0,右子树节点个数为2(因为是二叉搜索树,小于1的节点数都在根节点的左子树上,大于1的都在根节点的右子树上),以2为根节点,其左子树节点个数为1,右子树节点个数为1,以3为根节点,其左子树节点个数为2,右子树节点个数为0。因此递推公式 dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
2023-05-15 20:44:07
143
原创 Day40 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 62. 不同路径 63. 不同路径 II
dp递推公式:dp[i][j] = dp[i][j - 1] + dp[i - 1][j],要走到(m,n) 的位置,最后返回dp[m - 1][n - 1]就行。dp递推公式:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]) dp初始化:dp[0] = 0, dp[1] = 0,题目明确可以从第0层或者第1层开始爬,只有往上爬才花费。dp递推公式:dp[i][j] = dp[i][j - 1] + dp[i - 1][j],
2023-05-14 22:04:48
222
原创 Day39 LeetCode 738. 单调递增的数字 968. 监控二叉树
从后往前遍历,如果前一个数字大于后一个数字,说明不是单调递增的,那么前一个数字--,后一个数字标记赋值9的位置。然后从最初标记赋值9的位置开始,后面都赋值成9,这是因为要取单调递增的最大的数字。大体思路就是从下到上,先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头结点。2.左右节点至少有一个无覆盖的情况(left == 0 || right == 0)3.左右节点至少有一个有摄像头(left == 1 || right == 1)状态2:被覆盖(被摄像头监视的状态)
2023-05-13 21:37:12
81
原创 Day38 LeetCode 452. 用最少数量的箭引爆气球 435. 无重叠区间 763. 划分字母区间 56. 合并区间
先排序,让所有的相邻区间尽可能的重叠在一起 ,按照左边界从小到大排序之后,如果 intervals[i][0]<= intervals[i - 1][1],则一定有重叠。如果气球不重叠,则第i个气球的左边界大于第i-1个气球的右边界,则需要一个弓箭;如果气球重叠,则第i个气球的左边界小于等于第i-1个气球的右边界,则不断更新重叠气球的最小有边界。先根据区间的左边界进行由小到大进行排序,然后判断重叠区间,对重叠区间的数量进行统计,最后得到的重叠区间数量就是我们要移除区间的最小数量。
2023-05-12 22:30:01
117
原创 Day37 LeetCode45. 跳跃游戏 II 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果 860. 柠檬水找零 406. 根据身高重建队列
注意,此时candyvec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyvec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyvec[i](之前比较右孩子大于左孩子得到的糖果数量),取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。那么又是一个贪心:局部最优:只找数值最小的正整数进行反复的反转,直到将剩余k的次数用完,那么当前数值和可以达到最大。整体最优:数值和最大。
2023-05-11 22:21:29
68
原创 Day34 LeetCode 122. 买卖股票的最佳时机 II 55. 跳跃游戏
贪心策略:通过累加每一天的利润得到最大利润result,每一天的利润等于当天股价减去前一天买入的股价。如果每一天的利润大于0,就累加进 result。如果小于0,则舍去。i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。如果cover大于等于了终点下标,直接return true就可以了。不用纠结跳几步到终点,跳的时候关注最大能够跳的范围。
2023-05-08 22:24:38
102
原创 Day33 贪心算法 LeetCode 455. 分发饼干 376. 摆动序列 53. 最大子数组和
实际不需要删除操作,只需要统计峰值出现的数量就行。遍历nums,从头开始用count进行累加,如果累加和小于0了,再往后累加无论后面元素是正或负,都会拖累后面的子数组和,因此一旦count累加到nums[i]为负,那么就应该把count置为0,从nums[i + 1]开始重新累加。在这过程不断更新result,记录下最大值。大尺寸的饼干应该优先满足胃口大的孩子, 才能不造成饼干尺寸的浪费。因此这里的局部最优就是。步骤:先对饼干和胃口数组进行排序,从最大的饼干和胃口开始遍历,先遍历胃口再遍历饼干。
2023-05-07 21:42:50
123
原创 Day32 LeetCode332. 重新安排行程 51. N 皇后 37. 解数独
递归函数参数需要有一个int ticketNum,表示有多少个航班(终止条件会用上),函数的返回值不再是void,而是bool类型,因为不是收集所有的叶子节点,而是寻找一条路径找到了就返回true。注意判断皇后放的位置是否合法:1.不能同列 2.不能同行 3.不能成斜线(一种情况是放的位置在上一行皇后的右下角45度,另一种情况是放的位置在上一行皇后的左下角45度)递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。
2023-05-06 22:53:56
68
原创 Day31 LeetCode 491. 递增子序列 46. 全排列 47. 全排列 II
注意点2:需要一个used数组来记录本层元素是否使用过,定义为vector<bool> used(nums.size(), false),当在本层使用过后,used[i] 标记为true,回溯时path数组和used数组要一起回溯。对同一树层进行去重操作: if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) continue;注意点1:集合里含有重复元素,需要对元素进行去重,定义一个set集合,在遍历的时候对本层元素进行去重。
2023-05-05 22:48:32
137
原创 Day30 LeetCode131.分割回文串 93.复原IP地址 78.子集 90. 子集 II
本题和组合问题去重一样,注意先对集合进行排序,让相同的元素紧挨着一起,之后在 单层遍历逻辑里对处于同一树层的元素进行去重,去重逻辑是if(i > startIndex && nums[i] == nums[i - 1]) continue;单层搜索逻辑:因为一上来就要对元素进行分割,所以先判断是否是回文串,是的话把字串放进path数组里,注意字串可以调用str.substr()函数收集,然后进入下一层递归再回溯。思路:组合和分割问题收集的是树上的叶子节点 ,子集问题收集的就是树上的所有节点。
2023-05-04 22:24:38
47
原创 图解 HTTP
状态码的职责就是当客户端向服务器端发送请求时,描述返回的请求结果。301 Moved Permanently :永久性重定向,表示请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。当浏览器的默认语言为英语或中文时,访问相同的URI的Web页面时,则会显示对应的英文或中文页面。302 Found:临时性重定向,表示请求的资源已经被分配了新的URI,希望用户本次能使用新的URI访问。303 See Other:请求的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
2023-05-04 11:05:42
57
原创 图解 HTTP
客户端发送请求报文:服务器端返回响应报文:向请求URI指定的资源发送请求报文时,采用称为方法的命令。方法的作用在于,可以指定请求的资源按照期望产生某种行为。方法有GET,POST和HEAD等。HTTP协议的初始版本,每进行一次HTTP通信就要断开一次TCP连接。这造成了无谓的TCP建立和断开,增加了通信量。HTTP/1.1 和一部分的HTTP/1.0 提出了持久性连接,即只要一端没有明确表示断开连接,TCP就一直保持连接状态。管线化技术使得发送一个请求不用等到收到响应,才能发送下一个请求,而是可
2023-05-02 16:43:00
50
原创 图解 HTTP
TCP/IP协议族按照层次分为以下4层:应用层,传输层,网络层和数据链路层。应用层:向用户提供应用服务时通信的活动。HTTP协议处于该层。(HTTP,HyperText Transfer Protocol,超文本传输协议)。传输层:传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)协议处于该层。网络层:用来处理在网络上流动的数据包。
2023-05-02 15:40:49
46
原创 Day27 LeetCode39.组合总和 40.组合总和II
思路:需要一个参数startIndex来指定for循环的起始位置,注意题目允许同一个数字无限制地被使用, 因此递归传参时startIndex应该传i,而不是i+1。首先对集合进行排序,让重复的元素紧挨着一起。之后在for循环起始处对元素进行去重。思路: 因为集合中元素有重复的,所以在组合的过程中需要对元素进行去重。
2023-05-01 22:20:53
49
原创 Day25 LeetCode 216. 组合总和 III 17. 电话号码的字母组合
index从0开始计数,如果digits中元素个数为2,当index = 0时,第一层递归:收集digits[0]中的元素,index = 1时,第二层递归:收集digits[1]中的元素,再往下递归,此时index = 2等于digits中元素个数,此时已经把digits遍历完了,不需要收集了,所以直接返回。参数1:targetSum即题目要求的元素和;3.单层搜索过程:path用来收集路径上的元素,sum用来统计路径上的元素和,然后递归进入下一次循环,同时回溯sum和path数组。
2023-04-29 22:17:53
111
原创 Day24 回溯算法 LeetCode77.组合
集合n里面取k个数,那么n和k是两个int型的参数,还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。3.单层搜索的过程:,for循环每次从startIndex开始遍历,然后用path保存取到的节点i,再进行递归处理,最后backtracking的下面部分就是回溯的操作了,撤销本次处理的结果。2.回溯函数终止条件:path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合。
2023-04-28 21:52:25
109
原创 Day23 LeetCode669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树
3.单层递归逻辑:(1)当前节点的值小于low,不能直接返回NULL,因为其右子树上的节点的值可能在[low,high]区间内,所以还应该往其右子树上继续递归寻找,返回值应该是右子树修剪过后新的根节点,不能直接return root->right,而是return 递归函数(root->right);3.单层递归逻辑:首先取数组中间元素构建根节点,接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点,最后返回root节点。返回值是修剪过后的新的二叉搜索树的根节点。
2023-04-27 21:06:31
55
原创 Day22 LeetCode235. 二叉搜索树的最近公共祖先 701. 二叉搜索树中的插入操作 450. 删除二叉搜索树中的节点
3.单层递归逻辑:如果当前节点的值大于val,就往左子树进行插入,因为返回值是根节点的值,所以本层用root->left 和root->right来接住下层新加入节点的返回值,这样一层层的返回,就把节点加入二叉树里了,最后返回整颗树的根节点。3.单层递归逻辑:因为是二叉搜索树,树中元素值是有序的,如果当前节点cur的值大于p和q的值,说明p和q在cur的左子树上,需要向左遍历,如果当前节点cur的值小于p和q的值,说明p和q在cur的右子树上,需要向右遍历。2.终止条件:遇到空节点,返回NULL。
2023-04-26 21:44:14
57
原创 Day21 LeetCode530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的众数 236. 二叉树的最近公共祖先
2.终止条件:遇到空的话,因为树都是空了,所以返回空。如果 root == q,或者 root == p,说明找到 q p ,则将其返回。1.递归函数返回值以及参数:需要递归函数返回值,来告诉我们是否找到节点q或者p,那么返回值为bool类型就可以了。双指针:定义一个pre指针指向前一个节点,cur指针指向当前节点,在中序遍历的时候直接得到前后两个元素的差值。1.中序遍历二叉树得到一个有序数组,然后在有序数组里求最小差值。1.先中序遍历二叉树,用map统计元素出现的频率。3.统计数组中频率出现最高的元素。
2023-04-25 21:55:40
51
原创 Day20 LeetCode 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
二叉搜索树:若左子树不为空,其左子树上的所有节点的值都小于根节点的值;它的左右子树也是二叉搜索树。方法二:双指针,一个pre记录前一个节点的值,一个cur记录当前节点的值,如果中序遍历的时候始终保持cur->val > pre->val,说明是一颗二叉搜索树;方法一:使用中序遍历得到的是一个递增的序列,那么定义一个数组收集中序遍历的元素,然后再判断这个数组是否递增,注意二叉搜索树中元素不允许重复。1、递归参数和返回值:因为要合并两颗二叉树,参数是两颗二叉树的根节点,返回值是合并后的二叉树根节点。
2023-04-24 22:35:50
94
原创 Day18 513. 找树左下角的值 112. 路径总和 113. 路径总和 II 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树
终止条件: 定义一个count变量初始值为目标和,每次减去遍历路径节点上的数值,当遍历到叶子节点并且count == 0时,说明找到一条路径满足目标和,就把这条路径加入到二维数组result里,result用来记录所有满足目标和的路径的情况。终止条件:定义一个count变量初始值为目标和,每次减去遍历路径节点上的数值,当遍历到叶子节点并且count == 0时,说明找到一条路径满足目标和,返回true,如果遍历到叶子节点且不等于0,返回false。第五步:切割后序数组,切成后序左数组和后序右数组。
2023-04-22 22:52:38
43
原创 Day17 LeetCode222. 完全二叉树的节点个数 110. 平衡二叉树 257.二叉树的所有路径 404. 左叶子之和
需要用到前序遍历,因为是收集所有的路径,所以是从根节点一路往下遍历,直到叶子节点。然后开始回溯,如果有左叶子节点,先弹出左叶子节点,判断其左叶子节点的父节点是否还有右孩子,有就加入路径path,之后依次回溯到其父节点的父节点。2、高度的定义是指从该节点到叶子节点的的最长简单路径边的条数。层序遍历整颗完全二叉树,定义一个变量count,用来记录节点个数,当遍历到每一层里的每个节点时,令count++。递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。
2023-04-21 21:34:36
47
原创 Day16 LeetCode107. 二叉树的层序遍历 II 199.右视图 637. 层平均值 429. N 叉树的层序遍历 515. 在每个树行中找最大值 116.117.104.111.101.
定义一个变量depth记录深度,通过层序遍历的方法,只要每一层至少有一个元素就会把这层的元素放进队列里,队列就不为空,depth++,最后返回depth就是二叉树的最大深度。遍历每一层的时候计算每一层的平均数,定义一个变量sum,avg = sum / size;先对二叉树进行层序遍历,最后把层序遍历的结果调用resverse函数进行翻转, 就得到了自底向上的遍历结果。层序遍历,在遍历到每一层时将这层最后一个元素放入到res数组中,判断条件为i == size - 1。层序遍历到每一层时判断比较出最大值。
2023-04-20 22:40:12
52
原创 Day15 LeetCode144. 二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历(递归和非递归方法实现)102. 二叉树的层序遍历 226. 翻转二叉树
使用一个队列queue来保存我们遍历的结点,定义一个变量size记录遍历到的每一层的结点个数,比如当遍历到第一层时,size = 1,那们就可以知道从队列里需要弹出一个元素,每次弹出元素时依次把其左右孩子加入队列,此时size = 2,需要弹出两个元素就是第二层元素的个数,弹出第二层元素后,队列里有4个元素,size = 4,记录第三层元素的个数,依此类推。先序遍历是中左右,调整代码循环顺序中右左,再反转res数组,得到左右中,就是后续遍历的顺序。递归实现二叉树的前后中序遍历。
2023-04-19 22:39:53
39
原创 Day14 LeetCode20.有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 239. 滑动窗口最大值 347. 前 K 个高频元素
如果遇见操作符,如+,-,*,/,就把栈顶元素num1和栈顶元素后一个元素num2依次弹出,操作这两个num,比如遇见+,就计算num2 + num1,并把计算得到的结果再次压入栈,最后栈中剩下的元素就是表达式求值的结果,直接返回。2.对频率排序:使用小顶堆对频率进行排序,得到前k个高频元素,可以使用优先级队列priority_queue来排序,至于为什么用小顶堆,不用大顶堆,是因为大顶堆每次弹出的都是频率最高的那个元素,那么最后剩下的k个元素就是频率最低的k个元素,所以使用小顶堆。
2023-04-18 22:48:40
57
原创 Day12 LeetCode232. 用栈实现队列 225.用队列实现栈
2.pop:由于pop的元素位于队列里的最后一个,所以先统计队列的size,将最后一个元素的前面size-1个元素依次加入到队尾,相当于que.push(que.front()),最后再pop。2.往队列里push元素,等价于往入栈里push;队列pop元素时,如果出栈为空,把入栈里的元素依次pop,再push进出栈里,最后pop栈顶元素。1.push:建立一个队列que实现栈,当往栈里push元素时,等价于往队列里push。1.建立两个栈,一个入栈stIn,一个出栈stOut。
2023-04-17 22:20:04
68
原创 Day11 LeetCode151.反转字符串中的单词 剑指 Offer 58 - II. 左旋转字符串 28. 找出字符串中第一个匹配项的下标 459. 重复的子字符串
思路:还是用KMP算法,在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串,其中next数组记录的就是最长相等前后缀,len是字符串的长度,如果len % (len - (next[len - 1] + 1)) == 0 ,则说明数组的长度正好可以被 (数组长度-最长相等前后缀的长度) 整除 ,说明该字符串有重复的子字符串。LeetCode28. 找出字符串中第一个匹配项的下标。3.再单独反转字符串中的每个单词。LeetCode151.反转字符串中的单词。3.最后反转整个字符串。
2023-04-16 22:07:41
47
原创 Day9 LeetCode344.反转字符串 541.反转字符串 || 剑指offer 05.替换空格
首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。思路:定义左右指针,左指针left指向s[0],右指针right指向s[s.size() - 1],然后交换两个元素,交换后left++,right--。每次跳2k个,i += 2k。LeetCode541.反转字符串 ||LeetCode344.反转字符串。
2023-04-13 22:46:00
84
原创 Day8 | LeetCode15.三数之和 18.四数之和
接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。在三数之和的基础上再套一层for循环,相当于两层for循环,一层由k定义,一层由i定义,再通过left和right移动去寻找nums[k] + nums[i] + nums[left] + nums[right] 和target的关系,注意对k和i去重和剪枝的操作,有许多细节。
2023-04-12 22:07:00
47
原创 代码随想录第7天|LeetCode202.快乐数 1.两数之和 454.四数相加II 383.赎金信
2.定义一个unordered_set保存每次sum的值,然后在这个集合里遍历,如果遍历到1直接返回true,遍历到重复元素证明陷入到了无限循环返回false,没有重复元素就将sum加入到set里,将sum赋值给n,继续下一轮的操作。1.定义一个map,保存数组中遍历过的元素,其中key是数组元素值nums[i],value是数组下标i,key用来查询元素是否遍历过,value用来返回数组下标。2.然后遍历map,找 0 - (c+d)出现的次数count,将所有出现的count++,最后返回count。
2023-04-11 22:35:23
71
原创 代码随想录day6|LeetCode142.环形链表 242.有效的字母异位词 349.两个数组的交集
将nums1里的元素放进set里去重,得到result_set,再将nums2的元素和result_set里的元素进行对比,得到其交集的部分,这部分元素也放进一个unordered_set里。那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。2.当重合时,定义一个指针index1指向重合位置,再定义一个index2指向头节点,index1走一步,index2走一步,两个指针一定会在入口处相遇。,所以fast一定可以和slow重合。
2023-04-10 22:15:34
323
原创 代码随想录第四天|LeetCode24.两两交换链表中的结点 19.删除链表的倒数第N个结点 160.相交链表
2.如果都不为空,curA从链表A开始从头遍历,当遍历到NULL时,此时curA指向headB,开始遍历链表B,curB从链表B开始从头遍历,当遍历到NULL时,此时curB指向headA,开始遍历链表A,如果两个链表相交的话,此时curA遍历过的结点数和curB遍历过的结点数相等,curA和curB指向相交的第一个结点,返回curA。注意:在交换过程时,要事先保存两个临时变量,分别时temp1 = cur->next 和temp2 = cur->next->next->next;
2023-04-08 22:42:01
720
1
原创 LeetCode203.移除链表元素 707.设计链表 206.反转链表
2.在第n个结点插入时,需要找到第n-1个结点的位置,通过cur指针指向虚拟头结点,然后while(n--)不断遍历,此时cur来到第n-1个结点的位置上;双指针:定义pre指向前一个结点,cur指向当前结点,再用一个temp保存cur->next下一个结点,防止cur找不到下一个结点 ,最后返回pre就是反转后的头结点。2.如果删除的元素位于非头结点,那么就需要判断当前结点指向的下一结点是否等于val;设置一个虚拟头结点让其指向头结点,那么对头结点和非头结点的删除操作就是一样了。
2023-04-07 22:54:32
834
1
原创 LeetCode977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
同时定义一个新数组result,让k指向新数组的最后一个元素,当nums[i] * nums[i] >= nums[j] * nums[j],result[k] = nums[i] * nums[i],k--,i++;窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
2023-04-06 22:54:13
1168
1
原创 代码随想录算法训练营第一天| LeetCode704 二分查找 27移除元素
1.定义target在一个左闭右闭的区间,即[left,right];2.定义target在一个左闭右开的区间,即[left,right);
2023-04-05 22:35:40
809
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人