- 博客(40)
- 收藏
- 关注
原创 代码随想录算法训练营第四十二天|广度优先搜索理论基础、岛屿数量:深搜版、岛屿数量:广搜版
广搜(bfs)是一圈一圈的搜索过程。因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。广搜的过程:我们从图中可以看出,从start起点开始,是一圈一圈,向外搜索,方格编号1为第一步遍历的节点,方格编号2为第二步遍历的节点,第四步的时候我们找到终止点end。正是因为BFS一圈一圈的遍历方式,所以一旦遇到终止点,那么一定是一条最短路径。代码框架:其实,我们仅仅需要一个容器,能保存我们要遍历过的元素就可以,。。
2024-08-15 04:33:01
206
原创 代码随想录算法训练营第四十一天|图论基础、深度优先搜索理论基础、98. 所有可达路径、797. 所有可能的路径
图的种类:有向图 和 无向图,加权有向图, 加权无向图无向图中有几条边连接该节点,该节点就有几度。在有向图中,每个节点有出度和入度。出度:从该节点出发的边的个数。入度:指向该节点边的个数。深度优先搜索(DFS)、广度优先搜索(BFS)、并查集、拓扑排序、最小生成树系列、最短路算法系列...
2024-08-14 05:44:01
292
原创 代码随想录算法训练营第四十天|583. 两个字符串的删除操作、72. 编辑距离、647. 回文子串、516.最长回文子序列
4. 从递推公式 dp[i][j] = min(dp[i - 1][j - 1] + 2, min(dp[i - 1][j], dp[i][j - 1]) + 1);4. 遍历顺序:dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1](可以画图看出来是从左下角往右上角遍历)注意也可以写成:dp[i][j] = min({dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1});
2024-08-11 04:27:44
592
原创 代码随想录算法训练营第三十九天|1035.不相交的线、53. 最大子序和、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];3. 初始化:全部初始化为04. 上到下,从左到右5. 打印。
2024-08-08 06:36:04
539
原创 代码随想录算法训练营第三十八天|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143.最长公共子序列
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。1. dp数组:dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]。根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。
2024-08-06 05:20:05
883
原创 代码随想录算法训练营第三十七天|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后在买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。唯一的区别是这一次有k次交易的值,而上一次只有两次,所以我们可以构建一个nx(2k+1)的dp数组。给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格。这一题与前面的区别是,他有一个最大完成几次交易的值k。
2024-08-05 04:13:11
308
原创 代码随想录算法训练营第三十六天|买卖股票的最佳时机I,II,III
2. 状态转移方程:dp[i][0] = max(dp[i-1][0], -price[i]);与前一题唯一不同的在于dp[i][0]就是持有股票最大值的递推方程,比较的是(前一天不持有股票并买入新股票)和持有股票的值的最大值。3. 初始化:dp[0][1]和dp[0][3]是-prices[0],其他的都初始化为0就行。3. 初始化:dp[0][0]和dp[0][1]. 第0天持有这只股票的最大现金。
2024-07-25 23:06:05
606
原创 代码随想录算法训练营第三十五天|198.打家劫舍、213.打家劫舍II、337.打家劫舍 III
2. 如果偷第i个房间,那么dp[i] = dp[i-2]+nums[i],而如果不偷第i个房间,那么dp[i]=dp[i-1],即考虑i-1号房。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。我们计算了root的四个孙子(左右孩子的孩子)为头结点的子树的情况,又计算了root的左右孩子为头结点的子树的情况,计算左右孩子的时候其实又把孙子计算了一遍。
2024-07-24 04:07:17
380
原创 代码随想录算法训练营第三十四天|322. 零钱兑换、279.完全平方数、139.单词拆分
递推公式:凑足金额为j-coins[i]的方法有dp[j-coins[i]]个,那么只要再加上一个钱币(即一种方法),就是dp[j]的方法。dp[j]递推公式:和上一题一样,dp[j]由dp[j-i^2]得出,而他比dp[j-i^2]又多了一种方式。所以dp[j]的递推公式是min(dp[j], dp[j-i^2]+1)初始化:考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。
2024-07-14 18:56:25
510
原创 代码随想录算法训练营第三十三天|动态规划:完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)
既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。本题呢,dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。
2024-07-13 02:29:02
451
原创 代码随想录算法训练营第三十二天|1049.最后一块石头的重量II、494.目标和、474.一和零
有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x
2024-07-13 00:23:32
484
原创 代码随想录算法训练营第三十一天|动态规划:01背包理论基础、01背包理论基础(滚动数组)
3. dp[i][j]的初始化,由上两个公式可以看出,假如dp是一个表格,dp[i][j]是由它的正上方和左上角的数字推理出来的。2. 一维dp数组的递推公式:此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值。放物品i: (等于不放物品i时背包的状态加上i的价值)dp[i-1][j-weight[i]] + value[i]
2024-07-12 03:23:56
1020
原创 代码随想录算法训练营第三十天|62.不同路径、63. 不同路径 II
3. 初始化:如何初始化呢,首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。3.初始化:obs[i][0]==0/obs[0][j]==0, dp[i][0]=1, dp[0][j]=1;机器人试图达到网格的右下角(在下图中标记为 “Finish” )。1. dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。2. 状态转移方程:dp[i][j] = dp[i-1][j]+dp[i][j-1]
2024-07-09 04:46:40
310
原创 代码随想录算法训练营第二十九天|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
2. 递推公式:dp[i] =min((dp[i-1]+cost[i-1]), (dp[i-2]+cost[i-2]))dp[i] = dp[i - 1] + dp[i - 2]。还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。每次你可以爬 1 或 2 个台阶。2. 确定递推公式:dp[i] = dp[i-1]+dp[i-2];
2024-07-07 23:54:41
678
原创 代码随想录算法训练营第二十八天|56. 合并区间、738.单调递增的数字
在出现两个维度相互影响的情况时,两边一起考虑一定会顾此失彼,要先确定一个维度,再确定另一个一个维度。贪心算法:分发糖果(opens new window)贪心算法:根据身高重建队列(opens new window)在讲解本题的过程中,还强调了编程语言的重要性,模拟插队的时候,使用C++中的list(链表)替代了vector(动态数组),效率会高很多。
2024-07-07 22:14:01
477
原创 代码随想录算法训练营第二十七天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
直觉上来看,貌似只射重叠最多的气球,用的弓箭一定最少,那么有没有当前重叠了三个气球,我射两个,留下一个和后面的一起射这样弓箭用的更少的情况呢?那么就试一试贪心吧!局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。思路:为了能让所有区间尽可能地重叠,先对所有的区间排序(左区间或者右区间都可以),同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。用最远出现距离模拟了圈字符的行为。
2024-07-07 05:25:09
173
原创 代码随想录算法训练营第二十六天|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。
2024-07-05 04:54:05
906
原创 代码随想录算法训练营第二十四天|122.买卖股票的最佳时机II 、55. 跳跃游戏、45.跳跃游戏 II、1005.K次取反后最大化的数组和
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。你的目标是使用最少的跳跃次数到达数组的最后一个位置。判断你是否能够到达最后一个位置。
2024-07-04 22:20:20
219
原创 代码随想录算法训练营第二十三天|455.分发饼干、376. 摆动序列、53. 最大子序和
每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解。
2024-07-03 04:28:30
529
原创 代码随想录算法训练营第二十一天|93.复原IP地址、78.子集、90.子集II
本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。注意在讨论包含重复元素的题目中,要将数组从小到大排列。说明:解集不能包含重复的子集。说明:解集不能包含重复的子集。,记录添加逗点的数量。
2024-06-30 23:05:42
236
原创 代码随想录算法训练营第二十天|39. 组合总和、40.组合总和II、131.分割回文串
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。与上一道题的区别是,这道题的candidates中每个数字在每个组合中只能使用一次。元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。
2024-06-29 21:40:11
257
原创 代码随想录算法训练营第十八天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。如果root小于low,那么应该递归右子树,返回右子树符合条件的头节点,反之亦然。2. 终止条件:修剪的操作不是在终止的时候完成的,返回上一个节点就好。
2024-06-27 03:51:43
310
原创 代码随想录算法训练营第十七天|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。而在235的题目中,我们直接返回了root的左节点/右结点,是因为我们需要向下寻找,而不需要把节点返回给之前的结点。所以在搜索树中,我们可以从上往下遍历,并且只取最早碰到的节点数,这一定是两个子结点的最大祖先。终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。由于这是搜索树,所以只用搜索一个边,而当寻找到这个边的叶子结点的时候,就可以插入。
2024-06-26 05:20:08
199
原创 代码随想录算法训练营第十六天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
搜索整个树写法,因为在如下代码的后序遍历中,如果想利用left和right做逻辑处理, 不能立刻返回,而是要等left与right逻辑处理完之后才能返回。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。输入的是目前的node和目标node。后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
2024-06-25 04:40:46
274
原创 代码随想录算法训练营第十五天|654.最大二叉树、 617.合并二叉树 、700.二叉搜索树中的搜索、98.验证二叉搜索树
合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。3. 递归条件:中:两棵树的元素加到一起,左:合并 t1左子树 t2左子树之后的左子树,右:t1右子树 t2右子树之后的右子树。3. 选择单层递归:如果root的值大于目标,则搜索左子树,如果小于目标,则搜索右子树。终止条件:如果我们的数组的大小==1,到叶子节点了,可以返回了。说明根节点是叶子节点。给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
2024-06-23 04:47:43
231
原创 代码随想录算法训练营第十四天|112. 路径总和、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树
后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。参数:需要二叉树的根节点,还需要一个计数器,这个计数器用来计算二叉树的一条边之和是否正好是目标和,计数器为int型。给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
2024-06-21 05:41:48
386
原创 代码随想录算法训练营第十三天|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、513.找树左下角的值
可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。判断一个树的左叶子节点之和,传入树的根节点,递归函数的返回值为数值之和,所以为int。参数:当前传入节点。
2024-06-20 05:25:10
898
原创 代码随想录算法训练营第十二天|226.翻转二叉树 (优先掌握递归)、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
226.翻转二叉树 (优先掌握递归)226.翻转二叉树 (优先掌握递归)遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。
2024-06-19 04:15:22
300
原创 代码随想录算法训练营第十一天| 理论基础、 递归遍历、迭代遍历、层序遍历
在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度。层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了。二叉树的定义和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子.前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。
2024-06-18 05:42:15
289
原创 代码随想录算法训练营第十天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。计算机可以利用栈来顺序处理,不需要考虑优先级了。逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。给定一个非空的整数数组,返回其中出现频率前 k 高的元素。如果使用暴力方法,该算法的复杂度O(n*k)。什么是优先级队列priority_queue?二刷的时候试者自己再写一次。返回滑动窗口中的最大值。使用单调队列的经典题目。
2024-06-18 02:34:12
177
原创 代码随想录算法训练营第九天|栈与队列理论基础、232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项
栈提供push和pop等等接口,必须满足先进后出,不提供走访功能,也不提供迭代器(iterator)。栈的底层可以是vector,deque,list,主要是数组和链表的底层表现。第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
2024-06-15 22:57:06
622
原创 代码随想录算法训练营第八天|151.翻转字符串里的单词、右旋字符串、28. 实现 strStr()、459.重复的子字符串
next数组就是一个前缀表(prefix table)。能让我们去找到之前已经匹配过的内容。前缀表:起始位置到下标i之前(包括i)的子串中,有多大长度的相同前缀后缀。前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。循环不变量:遇到冲突看前一位。
2024-06-15 16:38:58
316
原创 代码随想录算法训练营第七天|344.反转字符串、541. 反转字符串II、替换数字
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。swap可以有两种实现: 交换数值/位运算。
2024-06-13 04:15:25
344
原创 代码随想录算法训练营第六天|第454题.四数相加II、383. 赎金信、第15题. 三数之和、第18题. 四数之和
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?但这里有一个问题,是判断 nums[i] 与 nums[i + 1]是否相同,还是判断 nums[i] 与 nums[i-1] 是否相同?给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0?要求返回的是数值的话,就可以使用双指针法了。
2024-06-12 04:44:26
930
原创 代码随想录算法训练营第五天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160. 链表相交、142.环形链表II
快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。思考:计算一个数的每个位置的平方和记为sum,将sum储存在set中,进行循环,如果出现sum已经存在在set中了,则立马返回false,因为这个时候数字开始循环。unordered_map是哈希表,而multimap和map都是红黑树,所以key是有序的。其实数组就是一个哈希表,关键码就是索引的下标,后通过下标直接访问数组中的元素。
2024-06-11 06:07:51
941
原创 代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160. 链表相交、142.环形链表II
cur指向需要交换节点的前一个节点,当链表数量为偶数的时候,cur->next = NULL结束遍历;从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。思路:我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置。能够尝试一趟遍历实现吗?
2024-06-08 20:13:51
272
原创 代码随想录算法训练营第三天| 203.移除链表元素、707.设计链表、206.反转链表
定义构造函数:C++// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x):val(x), next(NULL) {} // 节点的构造函数。
2024-06-07 05:04:50
245
原创 代码随想录算法训练营第二天| 977.有序数组的平方、27. 移除元素
数组平方的最大值就在数组的两端,不是最左边就是最右边。考虑两个指针分别指向两端,向中间移动,更大的值赋值到k的位置。k从数组的末端开始往前遍历。一个for循环做两个for的事情。j表示终止位置,它一步一步向后移动,但如何移动起始位置?暴力排序:时间复杂度是O(n+nlogn),主要取决于排序的算法复杂度。如果集合里面的元素大于s的话,起始位置往后移动。最终可以实现O(n^2)的时间复杂度降为O(n)滑动窗口也可以理解为双指针法的一种。组成的新数组,要求也按。主要思想:滑动窗口(
2024-06-06 05:32:42
385
原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。由于n/2^k取整后>=1,即令n/2^k=1,可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)。时间复杂度:时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。时间复杂度O(n), 空间复杂度O(1)。要求:有序数组,无重复元素,寻找到的元素下标是唯一的。时间复杂度是O(n^2),空间复杂度是O(1)。
2024-06-06 03:12:43
280
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人