
算法
文章平均质量分 98
教会你各种热门算法
Undoom
个人网站:https://deepseek.hyk52syx.club/
阿里云开发者社区专家博主,华为云享专家 ,腾讯云创作之星,支付宝开发者社区优秀季度创作博主,支付宝社区问答官,阿里云社区问答官,腾讯云TDP -先锋会员,华为云初级校园大使,腾讯云TDP-产品KOL,极星会KOL,2024博客之星NO.20
展开
-
深度解析算法之分治(归并)
但是如果nums[cur1]>nums[cur2]的话,那么我们就得将nums[cur1]在统计数的那个数组中的对应的位置加上我们有多少个小于cur2的位置的数了,所以我们得找到cur1的原始下标了,我的思路是使用hash,但是如果出现了重复元素的话就不好搞了。如果我们当前cur1大于cur2的话,因为这个是降序的,所以cur2后面的都比cur2小,所以我们找到比cur1小的数就行了,那么cur2后面一大堆比cur1小的,统计完当前数中有多少个数比cur1小的,然后我们的cur1进行右移操作。原创 2025-04-28 10:42:37 · 1655 阅读 · 97 评论 -
深度解析之算法之分治(快排)
代码的话我们可以先让right–,然后再将我们和我们i位置的交换,这样我们的指针也进行了移动的操作,此时我们将原先right-1的位置和i位置的元素进行交换了,那么我们此时的i位置的元素还是带扫描的元素,因为我们将后面的元素挪动到前面来了,我们此时是不需要动i的。我们更换下代码的思路,如果我们当前的nums[i]=0的话,我们直接将nums[++left]和nums[i++]进行交换,我们先将left++和i的位置交换,交换完成之后我们的i再往后面进行移动的操作。此时,我们递归查找左区间,递归范围是。原创 2025-04-25 11:01:24 · 2197 阅读 · 91 评论 -
深度解析算法之前缀和
在k=1的情况下,以mat数组为基础,我们的answer[0] [0]的大小j就是以mat[ 0] [0]为中心扩展一个格子的区域的总和,如果超出边界,那么超出边界的部分不算,那么我们这里的answer[0] [0]=12。对于这个数组来说的话,如果我们将上面数组中的0变-1,然后我们在下面数组中进行匹配,1和-1相加,那么结果就是0,那么问题就变成了在数组中找到一个连续的子数组,让这个子数组中的值的和是0就可以了。我们在求ans[i] [j]的时候,需要向四周扩展k个单位。原创 2025-04-20 09:19:07 · 1582 阅读 · 78 评论 -
深度解析算法之二分查找(2)
题目链接给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。示例 1:nums = [[3,4]示例 2:nums = [[-1,-1]示例 3:[-1,-1]给到我们的数组要么是递增的,要么是不变的暴力解法就是从开始到末尾,最差的情况下时间复杂度是O(N)原创 2025-04-19 11:57:57 · 1482 阅读 · 64 评论 -
深度解析算法之滑动窗口
然后我们进行判断,如果我们当前的right和left的范围大于我们words中字符串组合成的字符串的长度的话,那么我们就进行出窗口的操作,我们就得将我们的left往右边进行移动了,还是利用substr获取我们left后面len个字符的字符串,将这个字符串存在out中,然后将hash2中的out这个字符串给减一,在减一之前我们还需要维护下我们的count,对我们这个单词进行判断,是否是有效的单词。现在我们将问题进行转换:原来要求的是我们从最左边或者是最右边进行x删除元素,直到x变成0。原创 2025-03-31 19:35:16 · 1740 阅读 · 97 评论 -
深度解析算法之位运算
现在我们想判断我们第x位是不是1,那么我们让这个位上的数按位与1,但是前提我们先得让这个第x位上的数变成最低的位置,所以我们需要将这个数右移x位,那么我们当时要判断的数就跑到最前面了,然后&1,如果结果是1的话,那么就说明这个位置上的数是1,因为我们的1比较特殊,1的二进制只有最低位是1,其余全是0。比对原来的数,我们可以发现改变的仅仅是左边的区域,这个最右边的1的右边的区域是没有被改变的,而且左边的区域的数字和之前都是相反的。然后将原来的数和变负的数进行按位与的操作,那么除了最右侧的1,其他的都变成0。原创 2025-04-21 12:35:30 · 1732 阅读 · 81 评论 -
节点之舞在链表,演绎痴情代码情
我们这个题的思路就是找到中间节点,以中间节点为中心进行划分,将这个链表划分为两个链表,前半部分就是第一个链表,后半部分的反转版本就是我们的第二个链表。那么我们先创建两个链表的哨兵位来占位置,分别是这两个指针,并且我们初始化的时候直接存放0这个数据,因为我们的哨兵位是不需要实际数据存放的。本题需要对链表进行遍历和操作。了,就是当前节点的下一个节点了,随着遍历的结束那么我们这个链表的后半部分就完成了翻转操作了,我们的。我们让小节点的尾指针指向我们的大节点链表的头结点,并且我们让大节点的尾节点指向空。原创 2024-10-25 18:36:16 · 4456 阅读 · 127 评论 -
追寻数组的轨迹,解开算法的情愫
这个题其实很简单,我们定义快慢指针,快指针进行遍历数组的操作,如果快指针遍历到的数组的元素大小不等于。指向的数字是不一样的话,不那么我们就让i往右走一步,然后我们将当前j指向的数字放到我们的i的位置。因为给到我们的数组是有序的,那么这个重复的数字的话肯定是排列在一起的,重复元素是相邻的。是0开始的,然后只要遇到不同的元素,我们的i就进行加加的操作,那么我们的数组长度就是。的值的话,我们就将当前的值赋值到i这个位置上面,然后我们的。的指向的元素,那么我们不进行操作,然后我们的。原创 2024-10-23 08:26:47 · 3758 阅读 · 152 评论 -
指尖的无声告白,算法里的隐约温柔
我们固定的数小于等于0就行了,不需要去固定大于0的,如果固定的是大于0的数字的话我们是不能在这个数后面的区间之内找到负数的,所以我们固定。当我们找到一种结果之后,我们还要继续往后面进行寻找,但是不能和当次的结果重复了,所以我们要进行去重的操作,我们在去重之前先将这个数据。我们在固定的那个数的后面那个数开始,直到最后一个数直接的区域通过双指针来获取我们固定的数的相反数,这个相反数就是两个指针之和,我们在这个数组进行元素的固定,从第一个元素开始,然后我们后面的区间利用求三数之和的方法求的目标值。原创 2024-10-17 07:35:41 · 5699 阅读 · 96 评论 -
双指齐下:那晚我与算法的不解之缘
我们在链表中利用快慢指针进行不同速度的走,看看最后我们的两个指针能不能相遇,如果相遇了的话,那么这个就是带环的链表。然后我们在主函数中进行快慢指针的定义,快指针走两步,慢指针走一步,直到最后的数值相等了。在遍历数组的时候会遇到两种情况,一种是0,一种是非0,那么我们就需要分情况讨论了。我们先写出一个计算一个数的每一位上的数字的平方之和的函数,这里我们是。走了两步,然后因为走了一步就到最后的位置了,再走一步就到了边界之外了。我们这里的两种情况,一种是最后都是1,一种是进行不同数字之间的循环。原创 2024-10-16 08:41:50 · 2573 阅读 · 98 评论 -
我和双指针的初次亲密邂逅:那一刻心跳加速
如果大于C 的话,并且这个数组是已经排好了序的,所以在a和b这个区间之内,随便挑出了一个数来替换a和b进行相加都大于c的,那么我们就也不需要傻傻的往中间相加并且进行比较的操作了。判断策略二:如果我们直到这三个数的大小顺序的话,我们只需要将最小的两个数进行相加和最大的数进行比较,但是前提我们需要进行一个排序的操作。根据两个指针指向的数据的大小进行比较,谁小谁就进行移动,然后更新我们的体积最大值,直到这两个指针重叠。循环中,我们得判断,如果左指针和右指针指向的数加在一起小于固定的数,我们就可以让。原创 2024-10-17 07:35:55 · 1173 阅读 · 73 评论 -
轻触节点,链表里的悄然邂逅
同样是定义两个指针,然后在遍历的时候将当前的指向指向上一个节点,然后进行当前节点的改变,改变相邻两个节点的指针,随手遍历结束,我们的尾节点就变成了头结点,最后我们直接将头结点进行返回就行了。我的想法是:我们可以通过设置一个哨兵位然后利用双指针进行链表的遍历,然后我们的两个指针如果在遍历过程中遇到了满足条件的节点的话,我们直接忽略了,将这个节点的前一个节点的。满足条件的话,我们让这个节点的前一个节点指向这个节点的下一个节点,来达到间接删除当前的节点的作用。逆置过后就是这个样子的5->4->3->2->1。原创 2024-10-18 09:31:37 · 2579 阅读 · 128 评论 -
链上的羁绊,数据与节点的暗涌心跳
我们可以对两个链表进行遍历的操作,然后比较对应的节点的大小,在此之前我们先创建一个哨兵位用来占位子,如果哪个节点大的话我们就让哨兵位的nxet指向指向谁。然后我们就一次进行遍历,这个相当于在两个链表的基础上创建了一个新链表,在判断完大小之后,我们遍历两个链表的指针往后走,我们的哨兵位的指针也往后走。最后,因为我们的哨兵位是一个空壳,我们返回的是哨兵位的下个节点,这个节点才是名副其实的头结点。在循环中我们进行两个指针对应节点的判断,如果哪个节点对应的值小的话,我们就让我们的。循环条件就是fast!原创 2024-10-18 09:31:24 · 1032 阅读 · 72 评论 -
与双指针的亲密接触:快与慢的浪漫交错
循环的条件是只要我们的两个指针是大于等于0的话就一直进行循环操作,直到出现合并的现象或者是有一个数组的下标变成0了,然后另外一个数组还有元素没有完成迁移。在扫描后会将数组分为两个区间,一个是左边,一个是右边,右边就是待处理的区间,左边就是处理过的。放完之后我们将迁移元素的那个数组的指针往左边移动一位,操作就是指针减减。指向的元素进行交换的操作然后这么0就到后面去了,非0元素就在前面了。在里面又区分了两个区间,左边的就是非0元素,右边的就是0。指向的元素不是0的话,我们就进行条件语句,先将。原创 2024-10-16 08:41:15 · 1282 阅读 · 62 评论 -
链上相遇,节点之间的悸动与牵连
我们可以找出长链,然后计算出两个链的节点之差k,然后让长链走k次,那么我们的长链和短链就是同一个起点了,然后一起进行遍历的操作,边遍历边进行大小的比较的操作,如果两个链表遍历的指针相遇了的话,那么当前的指针所处的节点就是相交的节点了。然后在循环里面进行判断,如果长链表的指针等于短链表的指针,那么就说明两个指针相遇了,那么这个节点就是我们想要的相交节点了。这个题给我们两个链表,让我们找出两个链表的相交链表,然后将相交节点进行返回的操作,如果没有相交的节点的话我们直接返回。如果两个链表不存在相交节点,则返回。原创 2024-10-20 11:15:33 · 1159 阅读 · 112 评论 -
纵然链长千里,心终会在交点重逢
我们先创建快慢指针,利用快慢指针进行带环链表的判断,如果不带环我们就返回NULL,如果带环的话我们继续进行后面的判断操作,我们创建一个指针pcur指向当前的头结点,然后我们利用while循环,让慢指针和pcur一起进行链表的遍历操作,这个循环的条件是我们的pcur和慢指针相遇了,然后我们将此时的pcur进行返回,因为此时的pcur就是我们的带环节点处。我们可以先创建一个指针指向我们的头结点,等我们的快慢指针相遇了,然后我们就让指向头结点的这个指针和慢指针一起走,直到我们的头结点指针遇到了慢指针我们就停下。原创 2024-10-21 10:16:47 · 1337 阅读 · 53 评论 -
动态中的守候:滑动窗口与距离的诗篇
我们每次进行right的遍历,我们会判断当前的字符在不在哈希表里面,不在的话就将当前字符丢进去,如果我们right在遍历的时候然后对当前字符判断在不在哈希表里面,如果在的话我们就停止我们的枚举操作,那么这个长度就是我们Left到right的长度了。所以总结:当我们发现区间里面有重复字符的话,我们让left跳过这个重复字符,接下来再继续进行操作,那么我们的right就不用回来了,因为我们已经跳过了这个重复字符了,说明当前的Left和right区间之间是不存在重复字符的。原创 2024-10-21 10:17:36 · 1727 阅读 · 80 评论