保研专区
❤️LeetCode 热题100
00 min
2024-2-5
2024-6-30
type
status
date
slug
summary
tags
category
icon
password
😀
为了梦想,为了希望,为了全人类的未来。

方法

刷题八极拳: 坑爹用例全出来 双分单哈滑递动

第一拳:坑爹用例全出来

  • 最重要的一拳, 你要是少考虑了一种情况,整个算法函数就偏了,折腾半天就白耍了。卡在中间用例,或者死循环上,真噎人!即便你想到了后面的7拳,还是白耍!事实上差不多有一半的题目,它故意在例子上误导你,让你简单化算法,然后就偏了。。。
  • 用例,用例!第一拳打在用例上,我觉得考虑全了,面试官,你看还漏不漏?

后7拳:双分单哈滑递动

  • 绝大多数题目都是1000条数据以上,这就意味着你的算法效率必须低于O(n*n), 要不会超时。想运行的快速,O(n)级的算法都给套一遍:
  • 双指针:一快一慢,两端往中间走,中间往两端走,行不行吧?
  • 二分:排个序,单侧加倍二分,双侧二分,中间往两边分,有没有答案?
  • 单调栈:双侧单调栈刷一刷
  • 哈希集合:万能的字典集合,不用白不用
  • 滑动串口:左滑一下,右滑一下,可能就过去了
  • 递归:无论多少条数据,都可以万物归一递归下去,你就考虑一条的时候怎么整
  • 动态规划:证明证明,我要做数学推拿
面对新题目,你不可能很快想到思路,就给他耍一套八级拳,可以框住绝大多数中高难度的题目了。耍不出来的话,再耍一遍,一定是变形的题目,拳是对的,发错位置打空气了,找面试官确认哪一拳打空了?!!

哈希表

123

双指针

1. 移动零

题目
notion image
方法一:冒泡 慢
notion image
方法二:双指针
notion image
notion image

2. 盛最多的水

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

3. 三数之和

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

4. 接雨水

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

滑动窗口

无重复字符的最长子串

notion image
notion image
notion image

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

notion image
notion image
notion image
notion image
notion image
notion image

子串

和为K的子数组

notion image
方法一,枚举,时间复杂度O(n^2)
notion image
方法二:前缀和+哈希表 时间复杂度O(n)
notion image
notion image

滑动窗口最大值

notion image
notion image
notion image
notion image
 

最小覆盖子串

notion image
滑动窗口
notion image
notion image
notion image
notion image

普通数组

最大子数组和

notion image
方法一:动态规划
notion image
notion image
notion image
notion image

合并区间

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

轮转数组

notion image
notion image
notion image
notion image
notion image

除自身以外数组的乘积

notion image
notion image
notion image

缺失的第一个正数

notion image
notion image
notion image
notion image
notion image
notion image
notion image

矩阵

矩阵置零

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

螺旋矩阵

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

旋转图像

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image

搜索二维矩阵II

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

链表

相交链表

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image

反转链表

notion image
notion image

回文链表

notion image
notion image
notion image
notion image
notion image
notion image
notion image

环形链表

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image

链表常见问题总结

notion image
notion image
notion image
notion image

环形链表II

notion image
notion image
notion image
notion image
notion image
notion image

合并两个有序链表

notion image
notion image
notion image

两数相加

notion image
notion image
notion image
返回结点是头结点时要使用预先指针

删除链表的倒数第N个结点

notion image
notion image
notion image
notion image
notion image
notion image
notion image

两两交换链表中的值

notion image
notion image
notion image
notion image
notion image
notion image

K个一组翻转链表

notion image
notion image
notion image
notion image

随机链表的复制

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

排序链表

notion image
notion image
notion image
notion image

合并K个升序链表

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image

LRU缓存

notion image
notion image
notion image
notion image
notion image
notion image
notion image
 

二叉树

二叉树的中序遍历

notion image
notion image

二叉树的最大深度

notion image
notion image
notion image
notion image
notion image
notion image
notion image

翻转二叉树

notion image
notion image
notion image
notion image

对称二叉树

notion image
notion image
notion image
notion image
notion image
 

二叉树的直径

notion image
notion image
notion image
notion image
 

二叉树的层序遍历

notion image
notion image

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

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image

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

notion image
notion image
notion image
notion image

验证二叉搜索树

notion image
notion image
notion image
notion image
notion image
notion image
notion image
 

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

notion image
二叉搜索树的中序遍历是按照键增加的顺序进行的
notion image
递归代码:
notion image
迭代代码:
notion image
notion image
notion image
notion image
notion image

二叉树的右视图

notion image
notion image
notion image
notion image
notion image
notion image

二叉树展开为链表

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image

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

notion image
notion image
notion image
notion image
notion image
notion image

路径总和III

notion image
notion image
notion image
notion image
最终超时了
notion image
notion image
 
 

二叉树的最近公共祖先

notion image
notion image
notion image
notion image
notion image
notion image

二叉树中的最大路径和

notion image
notion image
notion image
notion image
notion image
notion image

图论

岛屿数量

notion image
notion image
notion image
notion image

腐烂的橘子

notion image
notion image
notion image

课程表

notion image
notion image
notion image
邻接表也可以用哈希表
notion image
 

实现Trie前缀树

notion image
notion image
notion image
notion image
notion image
208. 实现 Trie (前缀树) - 力扣(LeetCode)
208. 实现 Trie (前缀树) - Trie [https://baike.baidu.com/item/字典树/9825209?fr=aladdin](发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: * Trie() 初始化前缀树对象。 * void insert(String word) 向前缀树中插入字符串 word 。 * boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。 * boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。   示例: 输入 ["Trie", "insert", "search", "search", "startsWith", "insert", "search"] [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]] 输出 [null, null, true, false, true, null, true] 解释 Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // 返回 True trie.search("app"); // 返回 False trie.startsWith("app"); // 返回 True trie.insert("app"); trie.search("app"); // 返回 True   提示: * 1 <= word.length, prefix.length <= 2000 * word 和 prefix 仅由小写英文字母组成 * insert、search 和 startsWith 调用次数 总计 不超过 3 * 104 次
208. 实现 Trie (前缀树) - 力扣(LeetCode)

回溯

全排列

notion image
notion image
notion image
notion image
notion image

子集

电话号码的字母组合

notion image
notion image

组合总和

notion image
notion image
notion image

括号生成

notion image
DFS+回溯
notion image

单词搜索

notion image
notion image

分割回文串

N皇后

notion image
notion image
notion image
notion image

二分查找

搜索插入位置

notion image
notion image

搜索二维矩阵

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

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

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

搜索旋转排序数组

notion image
notion image
「二分」的本质是两段性,并非单调性。只要一段满足某个性质,另外一段不满足某个性质,就可以用「二分」。

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

notion image
notion image

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

notion image

有效的括号

notion image
notion image

最小栈

notion image
notion image

字符串解码

notion image
notion image

每日温度

notion image
notion image

柱状图中最大的矩形

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

数组中的第K个最大元素

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

前K个高频元素

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

数据流的中位数

notion image
notion image
notion image
notion image

贪心算法

买卖股票的最佳时机

notion image
notion image

跳跃游戏

notion image
notion image

跳跃游戏II

notion image
notion image

划分字母区间

notion image
notion image
notion image

动态规划

爬楼梯

notion image
notion image

杨辉三角

notion image
notion image

打家劫舍

notion image
notion image
这篇讲DP讲的很好

完全平方数

notion image
notion image

零钱兑换

notion image
notion image

单词拆分

notion image
notion image
notion image

最长递增子序列

notion image
notion image

乘积最大子数组

分割等和子集

notion image
notion image

最长有效括号

多维动态规划

不同路径

notion image
notion image

最小路径和

notion image
notion image

最长回文子串

notion image
notion image
notion image

最长公共子序列

notion image
notion image

编辑距离

notion image
notion image

技巧

只出现一次的数字

多数元素

颜色分类

notion image
notion image

下一个排列

notion image
notion image
notion image

寻找重复数

notion image
notion image
二分查找的变形、环形链表找环头的变形

Comments
  • Twikoo