LeetCode分类题解

℡╲_俬逩灬. 提交于 2020-08-09 20:31:30

欢迎访问个人博客http://home.znfang.ml

说明

本文主要是将14种分类题解进行翻译。这篇博文主要讲了14中类型的LeetCode的题解问题,本文也是在此基础上进行了翻译而已。同时如果要看具体的题目和题解,可以查看本人写的所有分类问题的题目解答-LeetCode分类题解

数组

此类型的题目,没有固定的模式,只能看自己的经验

其中每道题都存在一种暴力解法,如果实在没有更好的解法,可以尝试暴力解法

经典题目(英文)

滑动窗口

知识原理

一般从第一个元素开始,一直往右一个一个元素移动,滑动窗口的可以固定,也可以变换,如图所示

滑动窗口原理

主要题解

  • 用来执行数组或链表上某个区间(窗口)上的操作
  • 输入是线性结构,如,链表,数组,字符串,求最长/最短字符串或者某些特定长度的要求

经典题目(英文)

双指针

知识原理

  • 两个指针朝左右两个方向移动,直到他们其中有一个或者两个满足条件

base

题目辨析

  • 排好序的数组或者链表中寻找一些组合满足某种限制条件,这种组合可能是一对数,三个数或者一个子数组

经典题目(英文)

快慢指针

知识原理

又叫龟兔赛跑,两个指针在数组或链表上的移动速度不一样,如图

base

题目辨析

  • 问题需要处理环上的问题,比如环形链表和环形数组
  • 需要知道链表长度或某个特别位置的信息

用快慢指针不用双指针

  • 单链表上不能往回移动,判断链表是否是回文需要用到快慢指针

经典题目

区间合并

知识原理

用来处理有区间重叠问题,这个方法很高效,主要知识原理就看图了

base

题解辨析

  • 需要产生一堆相互之间没有交集区间的时候
  • 重叠区间的时候

经典题目

循环排序

知识原理

用来处理数组中的数值限定在一定的区间问题。

主要原理是遍历数组中的元素,如果当前这个数它不在其应该在的位置,就把它和应该在的那个位置交换一下。

原理图

题解辨析

  • 涉及到排序好的数组,而且数值一般满足于一定的区间
  • 排序好或者翻转过的数组中,寻找丢失的/重复的/最小的元素

经典题目

  • Cyclic Sort
  • Find the Missing Number
  • Find all Missing Numbers
  • Find the Duplicate Number
  • Find all Duplicate Numbers

链表翻转

知识原理

翻转链表的某个节点,通常要求原地操作,不使用额外的空间

主要原理就是用多个指针去定义变量,然后进行翻转。

通常需要保存处理当前节点的上一个节点,不然反转就会丢失链表信息,指向前一个节点后,需要更新当前节点和上一个节点位置,进行下一次遍历

原理图

题解辨析

  • 链表反转且原地操作

经典题目

广度优先搜索

知识原理

主要用于树的广度优先搜索。借助于队列数据结构,从而保证树的节点按照他们的层数打印出来(也就是层序遍历)。每一层执行完,才会进行到下一层。

主要操作是,把根节点加入到队列中,然后不断遍历直到队列为空。每一次循环中,把队列首部的节点拿出来,然后对其进行必要的操作,在删除节点时,左右子节点都会压入队列

题解辨析

  • 遍历树,且需要按层操作的方式

经典题目(英文)

深度优先搜索

知识原理

主要用于树的深度优先搜索来遍历树。可以使用递归或者栈来记录遍历过程中访问过的父节点。

从根节点开始,如果该节点不是子叶节点,需要做以下事情

  • 区别先处理根节点(前序遍历),处理子节点之间处理根节点(中序),还是最后处理根节点(后序)
  • 递归处理当前节点的子节点

题解辨析

  • 需要按前中后序遍历树
  • 如果该问题的解一般离叶子节点比较近

经典题目(英文)

回溯算法

知识原理

主要用于树的深度优先搜索时,如果不满足条件,需要回溯的方式,一般采用递归的方式进行

主要的思路是先不管满足不满足条件,把其中可能的结果压入,等到单个递归结束时,需要把之前的压入的弹出即可

题解辨析

  • 求解的问题,可能存在多个分支,但不确定是哪个分支有解

经典题目(英文)

双堆问题

知识原理

把数字分成两半,小的数字放在一起,大的数字放在一起,双堆模式就能高效解决此类问题,一般最大堆和最小堆是常用的两个结构

主要题解

  • 优先队列和计划安排问题上有奇效
  • 数组中找最大/最小/中位数
  • 二叉树数据结构中也有应用

经典例题

子集问题

知识原理

主要是涉及到排列和组合问题。子集问题讲的是用BFS来处理这些问题。

处理步骤结合实例讲解如下:给一组数字[1,5,3]

  • 从空集合开始
  • 把第一个数加入到之前已经存在的集合中
  • 把第二个数加到之前的集合中
  • 再把第三个数加入到之前的集合中

具体图解如下

原理图

主要题解

  • 求数字的排列组合

经典例题

  • Subsets
  • Subsets With Duplicates
  • Permutations
  • String Permutations by changing case
  • Balanced Parentheses
  • Unique Generalized Abbreviations

二分搜索

知识原理

主要用于排序好的数组、链表或者矩阵,去寻找特定的元素。

这种模式的步骤是这样的:

  • 算出左右端点的中点 middle = (start + end) / 2.
  • 如果要找的目标刚好和中点所在的位置数值相等,直接返回
  • 如果不相等,两种移动方式,目标比中点值小,end = middle - 1; 否则 start = middle + 1

原理如图

原理图

题解辨析

  • 求解排序问题的查找

经典题目(英文)

TOK-K

知识原理

最佳数据结构就是堆,Java中叫做优先队列

  • 根据题目要求,将K个元素插入到最大堆或者最小堆
  • 遍历剩下的还没访问的元素,如果当前出来到的这个元素比堆顶元素大,那把堆顶元素先删除,再加当前元素进去

原理如下

原理图

主要题解

  • 求最大/最小/最频繁的前k个元素
  • 排序去找一个特定的数

经典题目

多路归并

知识原理

解决涉及到多组排序好的数组问题。

每当你的输入是K个排序好的数组,可以用堆来遍历其中所有数组中的元素。将每个数组中最小的压入到堆,从而得到全局最小值,拿到全局最小值后,再从该元素所在的数组中取下一个元素压入堆。如此处理完所有的元素

解题步骤:

  1. 把每个数组中的第一个元素都加入最小堆中
  2. 取出堆顶元素(全局最小),将该元素放入排好序的结果集合里面
  3. 将刚取出的元素所在的数组里面的下一个元素加入堆
  4. 重复步骤2,3,直到处理完所有数字

原理如下

原理图

主要题解

  • 输入是排序好的数组、链表或者矩阵
  • 合并多个排好序的集合,或者找集合中第K小的元素

经典题目

动态规划

知识原理

动态规划问题主要是要求得子问题。即最重要的两个点

  1. 初始值
  2. 状态转移方程。dp[i]与dp[i-1]甚至dp[i-2]之间的关系

主要题解

  • 下一个输出依赖上一个输出
  • 求最优解

经典题目

拓扑排序

知识原理

用来寻找一种线性的顺序,这些元素之间有依赖性。比如事件B依赖于事件A,那么A在拓扑排序中排在B的前面

解题顺序如下:

  1. 初始化
    • 借助于hashmap将图保存成邻接表的形式
    • 找到所有的起点,用hashmap来帮助记录每个点的入度
  2. 创建图
    • 利用输入,把图建好,然后遍历一遍图,将入度信息记录在hashmap中
  3. 找到所有的起点
    • 所有入度为0的节点,都是有效的起点,而且我们将他们都加入到一个队列中
  4. 排序
    • 对于每个起点,执行以下步骤
    1. 把它加入到结果的顺序中
    2. 将其在图中的孩子节点取到
    3. 将其孩子的入度减1
    4. 如果孩子的入度为0,则改孩子为起点,将其加入队列
    • 重复上述过程,直到队列为空

原理如图

原理图

主要题解

  • 待解决的问题需要处理无环图
  • 以一种有序的秩序更新输入元素
  • 需要处理的输入遵循某种特定的顺序

经典题目

图论算法

知识原理

图论算法主要是深度优先搜索和广度优先搜索,其大部分的解决方法都与树类似,具体不多展开

题解辨析

  • 明显就是图论的算法题

经典题目

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!