type
status
date
slug
summary
tags
category
icon
password
为了梦想,为了希望,为了全人类的未来。
方法
刷题八极拳: 坑爹用例全出来 双分单哈滑递动
第一拳:坑爹用例全出来
- 最重要的一拳, 你要是少考虑了一种情况,整个算法函数就偏了,折腾半天就白耍了。卡在中间用例,或者死循环上,真噎人!即便你想到了后面的7拳,还是白耍!事实上差不多有一半的题目,它故意在例子上误导你,让你简单化算法,然后就偏了。。。
- 用例,用例!第一拳打在用例上,我觉得考虑全了,面试官,你看还漏不漏?
后7拳:双分单哈滑递动
- 绝大多数题目都是1000条数据以上,这就意味着你的算法效率必须低于O(n*n), 要不会超时。想运行的快速,O(n)级的算法都给套一遍:
- 双指针:一快一慢,两端往中间走,中间往两端走,行不行吧?
- 二分:排个序,单侧加倍二分,双侧二分,中间往两边分,有没有答案?
- 单调栈:双侧单调栈刷一刷
- 哈希集合:万能的字典集合,不用白不用
- 滑动串口:左滑一下,右滑一下,可能就过去了
- 递归:无论多少条数据,都可以万物归一递归下去,你就考虑一条的时候怎么整
- 动态规划:证明证明,我要做数学推拿
面对新题目,你不可能很快想到思路,就给他耍一套八级拳,可以框住绝大多数中高难度的题目了。耍不出来的话,再耍一遍,一定是变形的题目,拳是对的,发错位置打空气了,找面试官确认哪一拳打空了?!!
哈希表
123
双指针
1. 移动零
题目

方法一:冒泡 慢

方法二:双指针


2. 盛最多的水




起初用两个for循环遍历每种情况,结果超时了。
事实上有很多事情是可以忽略的,只会产生更坏的结果,所以做题还是需要更深入思考,不一定每种情况都要遍历。


3. 三数之和

当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将枚举的时间复杂度从O(N^2)减少至O(N)。



4. 接雨水




当两个指针相遇时,即可得到能接的雨水总量。



滑动窗口
无重复字符的最长子串



找到字符串中所有字母异位子串






子串
和为K的子数组

方法一,枚举,时间复杂度O(n^2)

方法二:前缀和+哈希表 时间复杂度O(n)


滑动窗口最大值




最小覆盖子串

滑动窗口




普通数组
最大子数组和

方法一:动态规划




合并区间



先排序,再按以上三种情况进行讨论


轮转数组





除自身以外数组的乘积



缺失的第一个正数







矩阵
矩阵置零



优化空间复杂度方法:用矩阵的空间来作为标记




螺旋矩阵


定义上下左右边界然后收缩


旋转图像












搜索二维矩阵II



从左下角开始找也是可以的

链表
相交链表










反转链表


回文链表







环形链表








链表常见问题总结




环形链表II






合并两个有序链表



两数相加



返回结点是头结点时要使用预先指针
删除链表的倒数第N个结点







两两交换链表中的值






K个一组翻转链表




随机链表的复制

先用一个循环把新旧链表对应的两个结点捆绑在一个二元组里,然后再用一个循环完成对新链表每个结点的next域和random域的赋值

排序链表




合并K个升序链表








LRU缓存







二叉树
二叉树的中序遍历


二叉树的最大深度







翻转二叉树




对称二叉树





二叉树的直径




二叉树的层序遍历


BFS 的使用场景总结:层序遍历、最短路径问题









将有序数组转换为二叉搜索树




验证二叉搜索树







二叉搜索树中第K小的元素

二叉搜索树的中序遍历是按照键增加的顺序进行的

递归代码:

迭代代码:





二叉树的右视图






二叉树展开为链表















从前序与中序遍历序列构造二叉树






路径总和III




最终超时了


二叉树的最近公共祖先






二叉树中的最大路径和






图论
腐烂的橘子



回溯
全排列





括号生成

DFS+回溯

单词搜索


N皇后




二分查找
搜索插入位置


搜索二维矩阵





方法三:从左下角Z字形查找

在排序数组中查找元素的第一个和最后一个位置



GPT写法,看起来更清晰明了


寻找旋转排序数组中的最小值


寻找两个正序数组的中位数

栈
有效的括号


最小栈


字符串解码


每日温度


柱状图中最大的矩形


两个技巧:
- 在原数组前后添加0(两个哨兵)可以处理很多边界情况(个人觉得类似链表前面会定义一个prev结点)
- 单调栈,每次pop出来时计算宽度(前面一个元素肯定小于它,将要进来的后面一个元素肯定也小于它)
一个思路:
- 只想到了固定一个柱子,往右依次遍历,但没想到可以固定中间的柱子作为高,向左向右找最大宽度(虽说复杂度都是N方)
堆
数组中的第K个最大元素


下沉函数的参数有三个:原数组、根节点下标、堆大小
heap_size / 2 表示第一个非叶子节点(root为0)
left_child = 2 * root + 1;
right_child = 2 * root + 2;
前K个高频元素



方法二:直接用优先队列,不手搓堆了

数据流的中位数




贪心算法
买卖股票的最佳时机


跳跃游戏


跳跃游戏II


划分字母区间



动态规划
爬楼梯


杨辉三角


完全平方数


零钱兑换


最长递增子序列


分割等和子集


多维动态规划
不同路径


最小路径和


最长回文子串



技巧
- Author:S+M
- URL:http://www.sujiaming.top/article/7185c514-115c-4891-869c-6f56ca98e69e
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!