![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
面试经典150
每日刷题小记录
Firedash
这个作者很懒,什么都没留下…
展开
-
双指针专题
思路:经典题目,可以暴力但时间复杂度O(n**2),也可以一层枚举+二分查找,复杂度O(nlogn),最快双指针,可以充分利用数组非递减,一头一尾两个指针,计算和,小了左边的右移,大了右边的左移。为什么谁小谁移动可以得出解呢,因为如果小的固定,那么另外一个无论怎么移动,水都不会更多了,所以要移动小的,看看有没有大一点的,能抬高杯壁上限。思路:一层枚举+双指针,需要先排序,主要点在于判断边界条件,由于要求不能重复, 因此指针移动时要看看值是不是一样,一样需要跳过。5. 盛水最多的容器。原创 2024-03-19 22:21:55 · 225 阅读 · 0 评论 -
Z字形变换
个人思路:矩阵中每个元素肯定和下标有某种函数关系,参考题解(这题感觉怪怪的)原创 2024-03-18 21:32:57 · 341 阅读 · 0 评论 -
找出字符串中第一个匹配项
C:官方题解代码,按理说应该需要保存前缀函数值,但python这套运行逻辑放在C上就无法运行,蛮奇怪的。感觉写出来的代码怪怪的,虽然能通过,但是比题解少很多。个人思路:用KMP算法,从跳过每次匹配成功的部分。原创 2024-03-18 21:31:12 · 388 阅读 · 0 评论 -
反转字符串中的单词
个人思路:直接采用split,reversed,join函数就行,高级语言一般都有这种函数。不过也要学习一下常规的思路,双端队列插入,挨个找出字符串压入队列,在转换成字符串。原创 2024-03-17 21:56:53 · 356 阅读 · 1 评论 -
最长公共前缀
个人思路:既然是公共的,那就说明每个字符串里都有,因此每取一个字母,判断一下所有字符串里有没有就行,当然取得字母最好是最短字符串里面的。字符串语法不太熟悉,最终还是看了题解。这两天笔试,刷题时间少了。原创 2024-03-16 22:06:42 · 353 阅读 · 1 评论 -
最后一个单词的长度
个人思路:从后往前遍历,遇到空格有两种情况,一开始就有空格和遍历完一个单词了才有,因此判断一下有没有遇到过单词就行。原创 2024-03-14 21:25:56 · 326 阅读 · 1 评论 -
135.分发糖果
个人思路:原本想用滑动窗口,维持长度为3的窗口挨个判断,但代码没写出来,似乎这个思路不对,因此改用左右两次遍历,左遍历的时候维护一个数组,把0处元素置1,其余根据大小判断加还是也为1,然后再右遍历,可以再维护一个数组记录右遍历情况,最后挑左右数组里面大的数相加(也可以算出右的时候直接判断,会快很多)原创 2024-03-14 21:19:57 · 344 阅读 · 1 评论 -
42.接雨水
思路:看过英雄哥的解题思路,知道要用前缀和后缀最值,定义俩数组,数组每个元素代表到当前这个元素为止,往左或往右最大的值,判断能接多少水的时候忽略两头。原创 2024-03-13 21:43:20 · 361 阅读 · 0 评论 -
134.加油站
遇到困难:想判断的是最后的落点 j 能否循环到 i ,但是这样对于10**6长度的数组会超时,看了题解思路,想到应该判断走过的路程是否为gasSize。个人思路:能想到类似滑动窗口,对于每个元素i,判断最远能到哪里,如果中途汽油为负,则从负的这个点的下一个地方开始重新判断。原创 2024-03-12 23:11:51 · 325 阅读 · 1 评论 -
除以自身意外数组的乘积
个人思路:常规思路,两个数组,一个左乘积一个右乘积,求出每一个元素的左乘积和右乘积,求得时候可以用递归,然后遍历每个元素,把左右相乘(如果发现存在1个以上的0,直接返回全零)原创 2024-03-12 21:40:05 · 380 阅读 · 1 评论 -
274.H指数
个人思路:创建新数组统计每个引用次数的文献的数量,然后挨个判断每个数是不是h指数,会用到后缀和,方法原始,需要额外的数组空间。思路升级,查找的最大h数不可能超过文献数量,且可以从后往前找,找到的第一个就是结果。原创 2024-03-12 11:15:39 · 369 阅读 · 1 评论 -
买卖股票的最佳时机
个人思路:对于price中每一个元素,只要后面存在比当前小的,那么卖出股票的时机就不可能当前元素,起码是后面那个更小的。因此额外定义一个卖出股票的下标索引,当找到更小的之后,更新卖出的下标。最大值采用持续更新策略,每次都计算一下取最大值。印象中C不是不可以用<=号的嘛,运行完才发现,大吃一惊。原创 2024-03-11 11:58:50 · 352 阅读 · 1 评论 -
27.移除元素
可以改变元素顺序,因此可以一左一右,把右边不是val的替换左边是val的,例如val=1,nums=[1,2,3,4,5],可以直接变成5234。双指针,一个指针用于判断元素大小,还一个定义元素插入的位置。原创 2024-03-10 16:27:21 · 331 阅读 · 0 评论 -
合并两个有序数组
1. 个人思路,从i=m处开始添加nums2元素,添加到m+n停止,再对数组进行排序:时间复杂度较高,未使用两个数组已经排序的特点。nums1后面是空的,因此可以从后往前塞,从大到小塞,无需额外空间,时间复杂度O(m+n)思路:两个数组各一个指针,每次取出较小的放入队列,需要额外的数组空间。原创 2024-03-10 16:13:13 · 350 阅读 · 0 评论 -
55.跳跃游戏
对于每一个元素,在它能到达的最远的下标之内,判断其中的每个元素能不能到numsSize-1,同时更新最远距离i+nums[i]个人思路:一开始想用倒序,但是逻辑没想通,因此改用挨个判断。原创 2024-03-11 19:53:23 · 310 阅读 · 1 评论 -
189.轮转数组
个人思路:每个元素向后移k位,超出数组长度的用mod操作重新计数,需要额外的数组空间。额外思路:两次翻转,先翻转全部,再反转0到k-1和k-1到最后。python有自带翻转函数reversed。原创 2024-03-10 23:25:35 · 366 阅读 · 1 评论 -
买卖股票的最佳时机Ⅱ
个人思路:一开始理解错了,以为只能买卖两次。随后改用贪心算法,总结起来就一句话,遇到有得赚的就卖,有钱就拿了再说。卖了股票之后,记得把start改成卖出的日子,往后继续找有没有钱赚。原创 2024-03-11 15:20:16 · 340 阅读 · 1 评论 -
删除有序数组中的重复项
个人思路:双指针,i代表判断的元素,j代表已经判断过的,用于判断i是否与之前重复(可行原因在于数组不严格递增).,返回j+1是因为数组长度是下标+1,为什么从第二个元素开始判断,因为第一个元素必定会保留。原创 2024-03-10 16:48:01 · 311 阅读 · 0 评论 -
删除有序数组中的重复项Ⅱ
同Ⅰ,多加一个判断条件:前一个相等前两个不等,且不与i周围元素判断,而是与j元素判断,否则j处赋值之后会影响i处元素的判断。前两个元素必定保留,因此取j=1开始判断。由于要取j=1.因此提前判断numsSize。升级,其实只要判断nums[i]和nums[j-1]即可。原创 2024-03-10 17:31:46 · 343 阅读 · 0 评论 -
169.多数元素
就这样各路军阀一直以这种以一敌一同归于尽的方式厮杀下去,直到少数阵营都死光,那么最后剩下的几个必然属于多数阵营,winner 就是多数阵营。(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人。如果新来的士兵和前一个士兵是同一阵营,则集合起来占领高地,领主不变,winner 依然是当前这个士兵所属阵营,现存兵力 count++;当下一个士兵到来,发现前方阵营已经没有兵力,新士兵就成了领主,winner 变成这个士兵所属阵营的旗帜,现存兵力 count ++。常规个人思路:哈希表。原创 2024-03-10 18:15:06 · 330 阅读 · 1 评论 -
45.跳跃游戏Ⅱ
个人思路:反向查找,但是python超时,参考跳跃游戏Ⅰ,每次在范围内查找能跳最远的index,其实就是在每次步长范围内查找index+nums[index]最大的那个。原创 2024-03-11 20:37:15 · 313 阅读 · 1 评论