进击的算法
文章平均质量分 67
那一天,人类终于想起了……被算法支配的恐惧
自由のミカサ
我要把算法题,一个不留地驱逐出去!
展开
-
顺序表 -- 【基础 】
nums.size()不能放进循环判断条件中,因为nums数组每一次都在增长,所以在每一次循环时nums.size()都在变大,所以看起来把n替换成nums.size()是一样的,其实不是。因为原题目限制数组元素的大小最大为1000,而要让一个元素同时拥有原来的元素值和需要改变的元素值,就通过设置一个密码来实现(相当于先加密再解密,解密的时候用不同的方式能够实现得到原始值或者改变值)因为元素大小小于等于1000,所以%1000,元素大小不会改变,但是却可以让被加密的元素变回原来的值;为什么要加上差值呢?原创 2024-03-09 23:40:49 · 834 阅读 · 0 评论 -
【题解】leetcode---69. x 的平方(二分查找入门)
给你一个非负整数x,计算并返回x的算术平方根。原创 2024-01-06 17:23:20 · 459 阅读 · 0 评论 -
爆杀双指针算法 ---【训练篇】
本篇为双指针算法题的题解汇总,也可以作为刷题训练的指南。整体难度从低到高排序更多题目持续更新中。原创 2023-12-19 18:14:08 · 380 阅读 · 0 评论 -
leetcode---76. 最小覆盖子串 [C++/滑动窗口+哈希表]
哈希表hash1用来统计t字符串中字符的频次,再设置一个kinds变量,当这个字符出现频次大于0时,就表示有一个种类。check判断hash2中的出窗口字符频次是否等于hash1中的频次,如果相等,则有效字符种类。创建哈希表hash2统计窗口中的字符出现的频次,创建count变量表示窗口中字符的种类。也就是说s字符串中的字符可能有非t字符串中的字符,或者多个t字符串中的字符(即重复)check判断 hash2中这个字符的频次是否和hash1中的频次 相等。在哈希表中更新right指针指向的元素的频次。原创 2023-12-19 17:56:27 · 587 阅读 · 0 评论 -
leetcode --- 30. 串联所有单词的子串[C++ 滑动窗口/双指针]
因为s字符串中可能出现words字符串中没有的字符,所以在进行比较的时候,hash1会先创建出一个空间再进行比较,这样就造成一定程度的时间消耗,所以在进行比较之前加个判断,hash1.count(in)判断这个字符串是否存在,如果不存在于words中,那就没有判断的必要,不影响有效字符串个数的大小。根据题目解析中的规律,当起始的字符跳过了一个words字符串的长度,那么就会和第一种情况(从第一个字符开始的分割方式)重复,所以滑动窗口的执行次数就是words字符串长度的大小。要在s字符串中找到串联子串。原创 2023-12-19 16:09:19 · 986 阅读 · 2 评论 -
leetcode --- 438. 找到字符串中所有字母异位词[C++/滑动窗口+哈希表]
判断 如果出窗口字符 out(最开始保存的)在hash_s中的个数要小于等于在hash_p中的个数,表示这个出窗口的字符是有效字符,有效个数count减小一个(判断条件没有大于,是因为如果是大于的话,那么这个字符本身就是多余的,在先前的入窗口中就不会增加有效个数,所以这里也就没必要减小有效个数)因为比较两个哈希表需要每一次都遍历哈希表,进一步优化,设置一个有效数count来记录哈希表hash_s中有效的字符个数,即hash_p(目标字符串的哈希表)中有的,hash_s也有时就为有效。原创 2023-12-19 14:38:58 · 486 阅读 · 0 评论 -
leetcode---904. 水果成篮 -- 【滑动窗口/c++】
用滑动窗口进行优化,因为当种类数超过2时,右指针其实不用回到左指针位置重新遍历,此时左右指针内的所有元素个数和就表示从左指针开始能达到的最大值(最多水果个数),这时只要左指针移动,直到哈希表中的长度等于2为止。而最多只能摘两种类型的果子,在示例1中就是,从下标0开始 有 1,2,1可以摘遍所有树;如示例1,fruit【1,2,1】就表示下标0处有1号类型的树,下标1处有2号类型的树,下标2处有1号类型的树。为判断摘的果子种类是否超过两种,用哈希表来记录摘的果子的种类。而哈希表的长度就表示含有的种类数。原创 2023-12-14 21:14:37 · 376 阅读 · 0 评论 -
leetcode -- 209 长度最小的子数组[滑动窗口/c++]
比如此题中,滑动窗口(双指针包围的数)内的数值和已经大于或等于目标值,此时right再++的话,len长度就更长了,题目要求返回长度最小的子数组长度,所以没有再让right++的必要,直接让left++,开始遍历下一个子数组。因为我们是在一达到题目要求(大于等于目标值)的情况下就进行调整的,也就是出窗口操作,所以也不可能存在漏解的情况。滑动窗口其实就是同向双指针,因为计算结果的单调性,在符合条件的情况下,左右指针不必往回回溯,而实现优化的效果。4.更新状态(可能在出窗口前,也可能在出窗口后,依情况而定)原创 2023-12-13 16:44:35 · 450 阅读 · 0 评论 -
leetcode--3. 无重复字符的最长子串[滑动窗口\哈希表 c++]
进窗口 --- 利用哈希表记录进入窗口的字符,即right指向的字符。因为字母有对应的ascii码值,可以转化为int类型,所以直接将字符作为哈希表的下标。判断 --- 在滑动窗口的判断阶段,若哈希表中存放的数字大于1,则说明当前right指向的字符重复。更新状态---此时right指针指向的字符的哈希表数据更新为1,表明不再重复,继续遍历。出窗口---直到left指针跳过了和right指针相同的字符。最长子串可以用滑动窗口解决,无重复字符可以使用哈希表解决。哈希表作为一个数组存放每个字符出现的次数。原创 2023-12-13 16:55:05 · 467 阅读 · 0 评论 -
leetcode --15 三数之和 【双指针 C++】
其实只要将三个数的其中一个数固定,而去找另两个数的和,就可以化用以前的知识了。题目中说的不可以包含重复的三元组,从示例1可以看出[-1,0,1] 和[0,1,-1]虽然三个数顺序不同但是元素重复了,所以只选取其中一个。因为固定的数也要去重,所以在用for循环时,在for后的式子中省略了最后一个调整,把调整放进了去重的操作中。而当一次双指针寻找循环结束后,固定数移动时,如果遇到了重复的数,则也要跳过。(固定数的选取的去重)找到一种符合要求的结果后,左右指针要跳过重复的数(双指针的选取的去重)原创 2023-12-13 16:32:43 · 409 阅读 · 0 评论 -
leetcode--1004 最大连续1的个数 III[滑动窗口c++]
比如k为2 那么数组 1 1 0 0 1 1 1 1 这个数组中最长子串的长度就是8,如果是在0等于2个时就停下,那么更新的结果就会是4 还是不理解可以自己提交示例运行试试)1.进窗口--- 遇到0计数器++,否则忽略( ps:滑动窗口的进窗口操作是载入数据,而不是单纯的移动right指针,如果只移动了right而没有对数据进行处理,则不算进窗口。3.出窗口---left移动,遇到0时计数器--,直到计数器的0个数等于k个,符合题目要求为止。题目的翻转0,意思就是把0变成1;原创 2023-12-13 17:16:06 · 438 阅读 · 0 评论 -
leetcode--611 有效三角形的个数 【双指针 C++】
因为排序后的数组具有单调性,从左到右递增,所以当两个指针的值已经大于固定的最大值时,left再++,仍旧会使结果大于最大值。所以后续的遍历已经没有必要,此时从left到right间的数都能与right和固定的最大值组成有效三元组,而数量就等于right-left。当判断到 2+4>5 时 ,左右指针间的数都能与右指针构成有效数对,并与最大固定值组成有效三元组。一般判断有效三角形要靠三次判断a+b>c(a,b,c对应三条不同的边)a+c>b , b+c>a。对数组排序优化后,利用单调性,双指针解决。原创 2023-12-07 01:07:28 · 377 阅读 · 0 评论 -
leetcode --- 283 移动零【双指针 C/C++】
原题链接。原创 2023-12-01 13:04:42 · 339 阅读 · 1 评论 -
leetcode返回二维数组的模板[C语言]
说明: int **returnColumnSizes 是一维数组的首元素地址,这个数组存放的是要返回的二维数组的每一行的列的个数。因为返回的是二维数组,所以先malloc一个指针类型的数组,然后再在其中malloc完整的列。returnSize 是二维数组的行数。原创 2023-12-08 00:03:51 · 377 阅读 · 0 评论 -
leetcode--11 盛水最多的容器 【双指针C/C++】
实际上,我们是从图中的左右两端的移动 造成 的容积大小变化而 总结出 左右两端可以看成是双指针的结论。继续寻找盛水最多的容器的方法就是移动指向4的指针(或者说改变较矮的木板),即不再去遍历计算 固定4(较短板)的容器储水量大小。若移动left指向5,则right指向的4 作为较矮的那一端,根据水桶原理,其(最短板)高度就是水位的高度,所以就算在宽度减小的时候遇到更高的,其水位高度也不会变化。而上面的情况都是针对容器的两端中较矮的那一端不动进行研究的,所以继续寻找盛水最多的容器的方法就是。原创 2023-12-05 23:09:22 · 444 阅读 · 0 评论 -
leetcode -- 1089 复写零 【双指针 C/C++】
只要按照下面步骤,就能找到最后一个需要“复写”的位置。结束时,cur指向的元素就是最后一个需要“复写”的位置1.判断cur位置的值2.决定dest往前走一步还是两步3.判断dest是否到结束位置4.cur++处理边界情况当最后一个复写元素是0时,dest连续走两步会直接到n(假设n为数组元素个数)位置,发生数组越界。这时将数组的最后一个元素赋为0,然后cur向前移动一步,dest向前移动两步。eg:原 1 0 2 3 0 4。原创 2023-12-01 18:16:43 · 380 阅读 · 1 评论 -
leetcode -- 202快乐数 [双指针 C/C++]
从我们刚刚的题目解析可以知道,最终结果为1的快乐数,可以看作是环上的点都是1。而不是快乐数的相遇点不是1,首先,既然能相遇,那么说明他们一定在环里,那么既然在环里,如果是快乐数,那环内的值就应该都是1,所以当相遇点非1的时候,这个数就不是快乐数。而两种情况其实可以归并为1种情况,将他们都看作在最后形成一个环,对于第一种情况,环上的数都是1,第二种则不是。只存在两种情况,一种情况是经过题目的运算后,最终结果变为1.另一种情况是经过题目运算后一直循环,即示例2的情况。定义双指针,一个慢指针一个快指针。原创 2023-12-03 13:02:00 · 347 阅读 · 1 评论