LeetCode算法技巧汇总 -- 持续更新,学无止境!

Posted 木兮同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode算法技巧汇总 -- 持续更新,学无止境!相关的知识,希望对你有一定的参考价值。

此篇是本人LeetCode算法刷题技巧汇总,还包括刷过的算法题分类,记录以便后续二刷三刷,也分享给大家欢迎一起交流。话说现在非常遗憾大学期间没能完成的两件事,一件是没能谈一场恋爱,还有一件就是没有坚持搞ACM,出来社会才后悔啊。大学的爱情是不可能出现了,但是算法还可以重新搞起,我也相信种一棵树是十年前,其次是现在,所以重新拾起为时不晚!最后,大学已经放弃过一次了,这次不可能放弃,欢迎大家的监督~



一、数组、链表、跳表

小技巧

  • 暴力能解决绝大部分算法题,但纯暴力往往都会超时,要学会剪枝。
  • 双指针法前后指针(左右夹逼),快慢指针
  • 升维:空间换时间。
  • 要记住:所有算法都是找重复性,机器的世界很简单(不像人心),基本上只会 if...else...forwhilerecursion,也就是它只会做重复的事,重复做事正好也是它所擅长的。
  • 看完题目懵逼了怎么办?
    • 先看看暴力能否解决
    • 案例分解查看基本情况
    • 找最近重复子问题

实战


二、栈、队列、树

小技巧

  • 链表:比较简单直接,多写。
  • 如果有个东西有最近相关性的话,可以尝试用栈解决。
  • 单调(递增/递减)栈,算法中比较常用,算法模板类似如下,也列出了几个算法实战题
stack<int> st;
// 此处一般需要给数组最后添加结束标志符
for (遍历这个数组)
{
	while (栈不为空 && 栈顶元素小于当前元素)
	{
	    栈顶元素出栈;
	    更新结果;
	}
	当前数据入栈;
}
  • :递归遍历,前中后序,有模板,不难,多写。

实战


三、递归、分治、回溯、DFS、BFS

小技巧

  • 思维误区:递归不慢,傻递归才慢,要想不傻,剪枝!或缓存中间结果。
  • 递归模板如下:
void recursion(level, param1, param2, ...) {

        // 递归终结条件
        if (level > MAX_LEVEL) {
            // 处理结果
            return;
        }

        // 处理当前层逻辑
        process(...)

        // 递归到下一层
        recursion(level + 1, ...)

        // 清理当前层
    }
  • 分治:分而治之,利用递归将大问题拆成小问题,直到最终子问题,逐步返回子问题结果,直到解决最初的问题。
  • 回溯:深度优先搜索的一种,关键在于不合适就退回上一步,同时将数据状态也回到上一步。
  • DFS:(Depth First Search)深度优先搜索,递归的一种,利用栈做回退,找所有解,或者遍历所有情况中途剪枝(遍所有)。
  • BFS:(Breadth First Search)广度优先搜索,递归的一种,一般利用队列,找最近或者最优解,(遍部分)。

实战


四、Java 常用库函数

数组排序:Arrays.sort(nums) // 对nums数组排序
数组填充:Arrays.fill(chars, '-') // 将chars数组全部填充为"-"
数组CopyArrays.copyOfRange(chars, 0, 10) // 复制chars中0(包含)-10(不包含)位为一个新数组
翻转字符串:new StringBuilder(strTmp).reverse().toString() // 将strTmp字符串翻转
拼接字符串:String.join(".", tmp) // 用"."拼接tmp(Iterable子类)中的数据为一个串
未完待续...

以上是关于LeetCode算法技巧汇总 -- 持续更新,学无止境!的主要内容,如果未能解决你的问题,请参考以下文章

leetcode算法228.汇总区间

LeetCode题解分类汇总(包括剑指Offer和程序员面试金典,持续更新)

Android常用技巧汇总(持续更新)

python使用小技巧汇总(持续更新)

LeetCode Animation 题目图解汇总(持续更新中...)

IDEA 常用的小技巧汇总,JAVA 新手上路必备,快上车!(持续更新)