LeetCode算法技巧汇总 -- 持续更新,学无止境!
Posted 木兮同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode算法技巧汇总 -- 持续更新,学无止境!相关的知识,希望对你有一定的参考价值。
此篇是本人LeetCode算法刷题技巧汇总,还包括刷过的算法题分类,记录以便后续二刷三刷,也分享给大家欢迎一起交流。话说现在非常遗憾大学期间没能完成的两件事,一件是没能谈一场恋爱,还有一件就是没有坚持搞ACM,出来社会才后悔啊。大学的爱情是不可能出现了,但是算法还可以重新搞起,我也相信种一棵树是十年前,其次是现在,所以重新拾起为时不晚!最后,大学已经放弃过一次了,这次不可能放弃,欢迎大家的监督~
一、数组、链表、跳表
小技巧
暴力
能解决绝大部分算法题,但纯暴力往往都会超时,要学会剪枝。双指针法
,前后指针
(左右夹逼),快慢指针
。升维
:空间换时间。- 要记住:
所有算法都是找重复性
,机器的世界很简单(不像人心),基本上只会if...else...
、for
、while
、recursion
,也就是它只会做重复的事,重复做事正好也是它所擅长的。 - 看完题目懵逼了怎么办?
- 先看看暴力能否解决
- 案例分解查看基本情况
- 找最近重复子问题
实战
- 1_两数之和
- 11_盛最多水的容器
- 15_三数之和
- 70_爬楼梯
- 283_移动零
- 141_环形链表
- 142_环形链表II
- 206_反转链表
- 21_合并两个有序链表
- 24_两两交换链表中的节点
- 26_删除有序数组中的重复项
- 66_加一
- 88_合并两个有序数组
- 189_旋转数组
二、栈、队列、树
小技巧
链表
:比较简单直接,多写。- 如果有个东西有
最近相关性
的话,可以尝试用栈解决。 单调(递增/递减)栈
,算法中比较常用,算法模板类似如下,也列出了几个算法实战题
stack<int> st;
// 此处一般需要给数组最后添加结束标志符
for (遍历这个数组)
{
while (栈不为空 && 栈顶元素小于当前元素)
{
栈顶元素出栈;
更新结果;
}
当前数据入栈;
}
树
:递归遍历,前中后序,有模板,不难,多写。
实战
- 20_有效的括号
- 22_括号生成
- 42_接雨水
- 49_字母异位词分组
- 84_柱状图中的最大矩形
- 94_二叉树的中序遍历
- 144_二叉树的前序遍历
- 155_最小栈
- 239_滑动窗口最大值
- 242_有效的字母异位词
- 429_N叉树的层序遍历
- 589_N叉树的前序遍历
- 590_N叉树的后序遍历
- 641_设计循环双端队列
三、递归、分治、回溯、DFS、BFS
小技巧
- 思维误区:
递归不慢
,傻递归才慢,要想不傻,剪枝!或缓存中间结果。 - 递归模板如下:
void recursion(level, param1, param2, ...) {
// 递归终结条件
if (level > MAX_LEVEL) {
// 处理结果
return;
}
// 处理当前层逻辑
process(...)
// 递归到下一层
recursion(level + 1, ...)
// 清理当前层
}
- 分治:
分而治之
,利用递归将大问题拆成小问题,直到最终子问题,逐步返回子问题结果,直到解决最初的问题。 - 回溯:深度优先搜索的一种,关键在于
不合适就退回上一步
,同时将数据状态也回到上一步。 - DFS:(Depth First Search)
深度优先搜索
,递归的一种,利用栈做回退,找所有解,或者遍历所有情况中途剪枝(遍所有)。 - BFS:(Breadth First Search)
广度优先搜索
,递归的一种,一般利用队列,找最近或者最优解,(遍部分)。
实战
- 17_电话号码的字母组合
- 39_组合总和
- 40_组合总和II
- 46_全排列
- 47_全排列II
- 60_排列序列
- 77_组合
- 78_子集
- 79_单词搜索
- 90_子集II
- 93_复原IP地址
- 98_验证二叉搜索树
- 104_二叉树的最大深度
- 105_从前序与中序遍历序列构建二叉树
- 111_二叉树的最小深度
- 130_被围绕的区域
- 200_岛屿数量
- 226_翻转二叉树
- 236_二叉树的最近公共祖先
- 297_二叉树的序列化与反序列化
- 733_图像渲染
- 784_字母大小写全排列
四、Java 常用库函数
数组排序:Arrays.sort(nums) // 对nums数组排序
数组填充:Arrays.fill(chars, '-') // 将chars数组全部填充为"-"
数组Copy:Arrays.copyOfRange(chars, 0, 10) // 复制chars中0(包含)-10(不包含)位为一个新数组
翻转字符串:new StringBuilder(strTmp).reverse().toString() // 将strTmp字符串翻转
拼接字符串:String.join(".", tmp) // 用"."拼接tmp(Iterable子类)中的数据为一个串
未完待续...
以上是关于LeetCode算法技巧汇总 -- 持续更新,学无止境!的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode题解分类汇总(包括剑指Offer和程序员面试金典,持续更新)