![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 50
sqattt
这个作者很懒,什么都没留下…
展开
-
图论专题(一)
需要注意的是,之前做BFS/DFS的题基本都是check某个节点的周边四个节点,而这题严格意义上来说是check某个节点的四条边,也算提醒了一下自己不要固定思维。注意边的方向一定是a到其他节点。需要标记已经遍历过的格子。原创 2023-05-17 21:25:41 · 507 阅读 · 0 评论 -
堆专题
堆分大根堆/小根堆,通常是一个可以被看做一棵完全二叉树的数组对象。堆中某个结点的值总是不大于或不小于其父结点的值。小根堆小根堆的基本操作堆排序的应用比较多。其最好/最坏/平均时间复杂度都为O(nlogn);由于是就地排序,空间复杂度为O(1)。堆排序经典应用:TopK问题。原创 2023-05-16 22:19:50 · 425 阅读 · 0 评论 -
栈专题
栈就不用多说了,一种后进先出的数据结构,常见的应用有单调栈。原创 2023-05-16 21:56:35 · 135 阅读 · 0 评论 -
二分查找专题
【代码】二分查找专题。原创 2023-05-16 13:36:21 · 293 阅读 · 0 评论 -
leetcode-二叉树专题
【代码】leetcode-二叉树专题原创 2023-05-14 21:44:08 · 278 阅读 · 0 评论 -
(多源广度优先搜索)leetcode-542. 01 矩阵
本题需要单独开一个seen数组来判断每个网格是否已经被处理过。(之所以在第一次访问时就要把网格的状态记录为已处理,后续所有访问到该网格的情况不再被考虑, 是因为本题求的其实是最短路问题,而bfs求的最短路一定是第一次访问到该点时的路径长度)做这题的时候新学了一下二维vector的初始化方式,记录一下。本题也是多源bfs,和leetcode-994. 腐烂的橘子。原创 2023-05-12 21:43:32 · 51 阅读 · 0 评论 -
(多源广度优先搜索)leetcode-994. 腐烂的橘子
而多源广度优先搜索相比于单源,无非就是最初初始化队列时,单源只需要加入一个源起点,而多源则需要把所有的多个起点都加入队列中,后面的步骤就差不多了。本题的代码有一个很巧妙的点:在判断一个点是否被访问过时,不需要单独开一个数组来记录访问状态,而是直接在原数组上修改值就可以。首先给出单源广度优先搜索的基本思路,参考。原创 2023-05-12 21:36:19 · 103 阅读 · 0 评论 -
leetcode-141. 环形链表
还可以考虑双指针:定义快慢指针,快指针一次走两个节点,慢指针走一个节点,如果有环的话快指针一定会追上慢指针,而环的长度就是两指针相遇时移动的次数。这题首先可以考虑暴力做法,每遍历一个节点就记下来,看能不能遍历到相同节点(hash真好用)。代码如下,算是一种空间换时间。原创 2023-05-07 11:13:36 · 41 阅读 · 0 评论 -
leetcode-160. 相交链表
双指针:一个指针pa指向A链表头节点,一个pb指向B链表头节点,两个指针依次向后遍历。如果pa/pb谁到链表终点,那就让它从B/A链表开始重新遍历,直到两个指针pa和pb相交。这样两个链表到最后一定会走过相同的路程(路程最长的情况就是:A和B没有共同节点,所以pa先走了一遍A再走B,pb先走一遍B再走A,最后在NULL处相交。首先hash:把一个链表中的所有节点存到哈希表中,再遍历另一个链表,查找每个节点是不是在hash表中出现过,时间复杂度为O(n),但要多开空间(属于是空间换时间)原创 2023-05-04 15:45:42 · 47 阅读 · 0 评论 -
(动态规划)leetcode-279. 完全平方数
即对于所有i*i<=n的i,在n-i*i的基础上再加一个完全平方数i*i就可以得到n,因此p[n]=p[n-i*i]+1,于是我们的目标就是找到最小的p[n-i*i]。很显然的动态规划的思路:假设和为n的完全平方数的最少数量为p[n],则对于每个n,都会有。),从1遍历到n-->O(n),对1-n中的每一个i向后遍历所有j*j-->O(p[n]=1+min(p[n-i*i]),其中i*i<=n。空间复杂度: O(n)时间复杂度: O(n。原创 2023-04-29 12:17:09 · 48 阅读 · 0 评论 -
(动态规划)leetcode-152. 乘积最大子数组
很显然,在num[i]<0的情况下,我们不应该考虑Max[i-1],而应该考虑Min[i-1],即我们希望乘一个绝对值最大的负数,这样负负得正,才能得到最合适的Max[i];本题显然也是动态规划的思路,假设Max[i]是以i为结尾的子数组的最大乘积,即Max[i]=max(nums[j]*```*nums[i]),其中0<=j<i<nums.size()。则显然,Max[i]与Max[i-1]有关。而若用Max[i]=max(nums[i],Max[i-1]*nums[i])来计算,就会出现。原创 2023-04-29 12:03:25 · 200 阅读 · 0 评论 -
(动态规划)leetcode-300. 最长递增子序列
即: 对于所有比i小的数j,如果有nums[i]>nums[j],则以nums[j]为结尾的递增子序列再加上i,还是一个递增子序列;在i的所有这样的递增子序列中,找到长度最大的那个,就是以nums[i]为结尾的最长递增子序列。本题很显然能用动态规划解。p[i]=max(p[j]+1),其中0<=j<i<n且nums[i]>nums[j]时间复杂度: O(n2)空间复杂度: O(n)原创 2023-04-29 11:36:07 · 94 阅读 · 0 评论 -
leetcode-128. 最长连续序列
这题有一个很简单粗暴的想法:把数组中的所有元素放入map的键中,值就存这个元素对应的下标(下标会不断更新,也是一个去重的过程);而map会对键做排序。因此把数组元素放到map的键当中后就完成了一个排序+去重的过程,然后再遍历所有的map键,找到其中最长的连续序列就行。好像还有其他做法,看看题解再回来更新)原创 2023-04-26 17:46:59 · 68 阅读 · 0 评论 -
leetcode-49. 字母异位词分组
思路就是把一个字符串"ABCDLJ```"看成是一个P进制的数(P一般取131),然后把每个子串的这个P进制转成十进制,计算出的就是hash值。注意这里的子串是以源字符串开头为开头的子串substr[0,n](比如"A","AB","ABC","ABCD","ABCDL","ABCDLJ",```)。顺序不同的字符串都归为一类,因此需要考虑新的hash计算方式,把字符的顺序省略掉。这里的p[r-l+1]是指p的r-l+1次方,因此可以提前预处理出p的所有次方值和substr[0,n]的hash值。原创 2023-04-26 17:42:51 · 43 阅读 · 0 评论 -
leetcode-1. 两数之和
具体的实现代码就非常简单了,就是遍历所有元素,如果当前元素可以在unordered_map中找到一个与其相加==target的值,就返回;否则就把这个元素加入unordered_map,用作对后续新添加的元素的匹配。唯一的难点在于hashtable中的键是元素值,值才是元素下标,有点绕(因为find函数是查找键是否存在的,存元素下标没有意义)hash可以自己实现,不过cpp的unordered_map可以代劳。2. 特点:无序(不会对存储的键值对进行排序),每个值对应一个键,不存在两个元素的键一样。原创 2023-04-25 23:20:16 · 43 阅读 · 0 评论 -
leetcode-8. 字符串转换整数 (atoi)
这题并不复杂,但是根据不同类型的输入会进行不同的操作,因此关键是有限状态自动机的应用。如果直接枚举出所有的情况,代码会非常复杂。此外这题还需要考虑溢出的边界情况。原创 2023-04-25 21:18:33 · 44 阅读 · 0 评论