优选算法
文章平均质量分 80
一些普通常见的算法介绍和例题
别致的影分身
这个作者很懒,什么都没留下…
展开
-
双指针算法
常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针。对撞指针:⼀般⽤于顺序结构中,也称左右指针。对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终⽌条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:(两个指针指向同⼀个位置)(两个指针错开)快慢指针:⼜称为⻳兔赛跑算法,其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列结构上移动。这种⽅法对于处理环形链表或数组⾮常有⽤。原创 2024-03-16 11:32:53 · 812 阅读 · 1 评论 -
滑动窗口算法
解法⼆(滑动窗⼝):算法思路:让滑动窗⼝满⾜:从i位置开始,窗⼝内所有元素的和⼩于target(那么当窗⼝内元素之和第⼀次⼤于等于⽬标值的时候,就是i位置开始,满⾜条件的最⼩⻓度)。做法:将右端元素划⼊窗⼝中,统计出此时窗⼝内元素的和:如果窗⼝内元素之和⼤于等于target:更新结果,并且将左端元素划出去的同时继续判断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)如果窗⼝内元素之和不满⾜条件:right++,另下⼀个元素进⼊窗⼝。原创 2024-03-16 16:36:57 · 924 阅读 · 1 评论 -
前缀和算法
解法(前缀和):算法思路:a.先预处理出来⼀个「前缀和」数组:⽤dp[i]表⽰:[1, i]区间内所有元素的和,那么dp[i - 1]⾥⾯存的就是[1, i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] + arr[i];b.使⽤前缀和数组,「快速」求出「某⼀个区间内」所有元素的和:当询问的区间是 [l, r]时:区间内所有元素的和为:。原创 2024-03-23 18:46:05 · 646 阅读 · 1 评论 -
二分查找算法
3.算法思路:⽤的还是⼆分思想,就是根据数据的性质,在某种判断条件下将区间⼀分为⼆,然后舍去其中⼀个区间,然后再另⼀个区间内查找;⽅便叙述,⽤x表⽰该元素,resLeft表⽰左边界,resRight 表⽰右边界。寻找左边界思路:◦我们注意到以左边界划分的两个区间的特点:▪左边区间 [left, resLeft - 1]都是⼩于x的;▪右边区间(包括左边界) [resLeft, right]都是⼤于等于 x的;•因此,关于 mid的落点,我们可以分为下⾯两种情况:◦。原创 2024-03-16 17:33:04 · 827 阅读 · 1 评论 -
分治——快速排序算法
解法(快排思想 - 三指针法使数组分三块):算法思路:类⽐数组分两块的算法思想,这⾥是将数组分成三块,那么我们可以再添加⼀个指针,实现数组分三块。设数组⼤⼩为n,定义三个指针◦left :⽤来标记0序列的末尾,因此初始化为-1;◦cur :⽤来扫描数组,初始化为0;◦right :⽤来标记2序列的起始位置,因此初始化为n。在 cur 往后扫描的过程中,保证:◦[0, left] 内的元素都是0;◦[left + 1, cur - 1] 内的元素都是。原创 2024-03-26 22:36:43 · 944 阅读 · 0 评论 -
分治——归并排序算法
解法(归并排序):算法思路:归并排序的流程充分的体现了「分⽽治之」的思想,⼤体过程分为两步:◦分:将数组⼀分为⼆为两部分,⼀直分解到数组的⻓度为 1,使整个数组的排序过程被分为「左半部分排序」 + 「右半部分排序」;◦治:将两个较短的「有序数组合并成⼀个⻓的有序数组」,⼀直合并到最初的⻓度。原创 2024-03-31 17:35:15 · 897 阅读 · 1 评论 -
有关哈希表算法
解法(哈希表):算法思路:•如果我们可以事先将「数组内的元素」和「下标」绑定在⼀起存⼊「哈希表」中,然后直接在哈希表中查找每⼀个元素的 target - nums[i],就能快速的找到「⽬标和的下标」。•这⾥有⼀个⼩技巧,我们可以不⽤将元素全部放⼊到哈希表之后,再来⼆次遍历(因为要处理元素相同的情况)。⽽是在将元素放⼊到哈希表中的「同时」,直接来检查表中是否已经存在当前元素所对应的⽬标元素(即 target - nums[i]如果它存在,那我们已经找到了对应解,并⽴即将其返回。原创 2024-04-05 15:19:08 · 1038 阅读 · 0 评论 -
有关字符串算法
解法:算法思路(两两⽐较):我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,这样就可以找出所有字符串的最⻓公共前缀。原创 2024-04-05 19:52:06 · 300 阅读 · 0 评论 -
有关链表算法
解法(模拟):算法思路:两个链表都是逆序存储数字的,即两个链表的个位数、⼗位数等都已经对应,可以直接相加。在相加过程中,我们要注意是否产⽣进位,产⽣进位时需要将进位和链表数字⼀同相加。如果产⽣进位的位置在链表尾部,即答案位数⽐原链表位数⻓⼀位,还需要再 new⼀个结点储存最⾼位。原创 2024-04-02 21:24:45 · 423 阅读 · 0 评论 -
有关栈的算法
解法(栈):算法思路:本题极像我们玩过的「开⼼消消乐」游戏,仔细观察消除过程,可以发现本题与我们之前做过的「括号匹配」问题是类似的。当前元素是否被消除,需要知道上⼀个元素的信息,因此可以⽤「栈」来保存信息。但是,如果使⽤ stack来保存的话,最后还需要把结果从栈中取出来。不如直接⽤「数组模拟⼀个栈」结构:在数组的尾部「尾插尾删」,实现栈的「进栈」和「出栈」。那么最后数组存留的内容,就是最后的结果。原创 2024-04-05 22:19:55 · 466 阅读 · 0 评论 -
位运算算法
解法(位图的思想):算法思路:利⽤「位图」的思想,每⼀个「⽐特位」代表⼀个「字符,⼀个int类型的变量的32位⾜够表⽰所有的⼩写字⺟。⽐特位⾥⾯如果是0,表⽰这个字符没有出现过。⽐特位⾥⾯的值是1表⽰该字符出现过。那么我们就可以⽤⼀个「整数」来充当「哈希表」。原创 2024-03-20 20:46:25 · 217 阅读 · 1 评论