欢迎访问个人博客http://home.znfang.ml
说明
本文主要是将14种分类题解进行翻译。这篇博文主要讲了14中类型的LeetCode的题解问题,本文也是在此基础上进行了翻译而已。同时如果要看具体的题目和题解,可以查看本人写的所有分类问题的题目解答-LeetCode分类题解
数组
此类型的题目,没有固定的模式,只能看自己的经验
其中每道题都存在一种暴力解法,如果实在没有更好的解法,可以尝试暴力解法
经典题目(英文)
- First Missing Positive
- Rotate Image
- Spiral Matrix
- Set Matrix Zeroes
- Word Search
- Longest Consecutive Sequence
- Single Number
- Contains Duplicate
- Product of Array Except Self
- Missing Number
- Find the Duplicate Number
- Find All Duplicates in an Array
- Find All Numbers Disappeared in an Array
- Circular Array Loop
- Shortest Unsorted Continuous Subarray
- Number of Matching Subsequences
滑动窗口
知识原理
一般从第一个元素开始,一直往右一个一个元素移动,滑动窗口的可以固定,也可以变换,如图所示
主要题解
- 用来执行数组或链表上某个区间(窗口)上的操作
- 输入是线性结构,如,链表,数组,字符串,求最长/最短字符串或者某些特定长度的要求
经典题目(英文)
- Longest Substring Without Repeating Characters
- Substring with Concatenation of All Words
- Minimum Window Substring
- Minimum Size Subarray Sum
- Sliding Window Maximum
- Longest Repeating Character Replacement
- Permutation in String
- Count Unique Characters of All Substrings of a Given String
- Fruit Into Baskets
- Minimum Number of K Consecutive Bit Flips
双指针
知识原理
- 两个指针朝左右两个方向移动,直到他们其中有一个或者两个满足条件
题目辨析
- 排好序的数组或者链表中寻找一些组合满足某种限制条件,这种组合可能是一对数,三个数或者一个子数组
经典题目(英文)
- Two Sum
- Container With Most Water
- 3Sum
- 3Sum Closest
- Trapping Rain Water
- Sort Colors
- Minimum Window Substring
- Remove Duplicates from Sorted List
- Subarray Product Less Than K
- Backspace String Compare
- Squares of a Sorted Array
快慢指针
知识原理
又叫龟兔赛跑,两个指针在数组或链表上的移动速度不一样,如图
题目辨析
- 问题需要处理环上的问题,比如环形链表和环形数组
- 需要知道链表长度或某个特别位置的信息
用快慢指针不用双指针
- 单链表上不能往回移动,判断链表是否是回文需要用到快慢指针
经典题目
- Add Two Numbers
- Remove Nth Node From End of List
- Remove Duplicates from Sorted List
- Linked List Cycle
- Linked List Cycle II
- Reorder List
- Sort List
- Remove Linked List Elements
- Palindrome Linked List
- Middle of the Linked List
区间合并
知识原理
用来处理有区间重叠问题,这个方法很高效,主要知识原理就看图了
题解辨析
- 需要产生一堆相互之间没有交集区间的时候
- 重叠区间的时候
经典题目
- Merge Intervals
- Insert Interval
- Non-overlapping Intervals
- Minimum Number of Arrows to Burst Balloons
- Task Scheduler
- Interval List Intersections
循环排序
知识原理
用来处理数组中的数值限定在一定的区间问题。
主要原理是遍历数组中的元素,如果当前这个数它不在其应该在的位置,就把它和应该在的那个位置交换一下。
题解辨析
- 涉及到排序好的数组,而且数值一般满足于一定的区间
- 排序好或者翻转过的数组中,寻找丢失的/重复的/最小的元素
经典题目
- Cyclic Sort
- Find the Missing Number
- Find all Missing Numbers
- Find the Duplicate Number
- Find all Duplicate Numbers
链表翻转
知识原理
翻转链表的某个节点,通常要求原地操作,不使用额外的空间
主要原理就是用多个指针去定义变量,然后进行翻转。
通常需要保存处理当前节点的上一个节点,不然反转就会丢失链表信息,指向前一个节点后,需要更新当前节点和上一个节点位置,进行下一次遍历
题解辨析
- 链表反转且原地操作
经典题目
- Swap Nodes in Pairs
- Reverse Nodes in k-Group
- Rotate List
- Reverse Linked List II
- Reverse Linked List
- Odd Even Linked List
广度优先搜索
知识原理
主要用于树的广度优先搜索。借助于队列数据结构,从而保证树的节点按照他们的层数打印出来(也就是层序遍历)。每一层执行完,才会进行到下一层。
主要操作是,把根节点加入到队列中,然后不断遍历直到队列为空。每一次循环中,把队列首部的节点拿出来,然后对其进行必要的操作,在删除节点时,左右子节点都会压入队列
题解辨析
- 遍历树,且需要按层操作的方式
经典题目(英文)
- Binary Tree Level Order Traversal
- Binary Tree Zigzag Level Order Traversal
- Binary Tree Level Order Traversal II
- Minimum Depth of Binary Tree
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node II
- Binary Tree Right Side View
- Number of Islands
- Average of Levels in Binary Tree
- All Nodes Distance K in Binary Tree
深度优先搜索
知识原理
主要用于树的深度优先搜索来遍历树。可以使用递归或者栈来记录遍历过程中访问过的父节点。
从根节点开始,如果该节点不是子叶节点,需要做以下事情
- 区别先处理根节点(前序遍历),处理子节点之间处理根节点(中序),还是最后处理根节点(后序)
- 递归处理当前节点的子节点
题解辨析
- 需要按前中后序遍历树
- 如果该问题的解一般离叶子节点比较近
经典题目(英文)
- Validate Binary Search Tree
- Same Tree
- Maximum Depth of Binary Tree
- Construct Binary Tree from Preorder and Inorder Traversal
- Path Sum
- Path Sum II
- Binary Tree Maximum Path Sum
- Implement Trie (Prefix Tree)
- Word Search II
- Invert Binary Tree
- Kth Smallest Element in a BST
- Lowest Common Ancestor of a Binary Search Tree
- Lowest Common Ancestor of a Binary Tree
- Serialize and Deserialize Binary Tree
- Path Sum III
- Diameter of Binary Tree
- Subtree of Another Tree
- Merge Two Binary Trees
- Maximum Binary Tree
- Maximum Width of Binary Tree
回溯算法
知识原理
主要用于树的深度优先搜索时,如果不满足条件,需要回溯的方式,一般采用递归的方式进行
主要的思路是先不管满足不满足条件,把其中可能的结果压入,等到单个递归结束时,需要把之前的压入的弹出即可
题解辨析
- 求解的问题,可能存在多个分支,但不确定是哪个分支有解
经典题目(英文)
- Letter Combinations of a Phone Number
- Generate Parentheses
- Sudoku Solver
- Combination Sum
- Combination Sum II
- Permutations
- Permutations II
- N-Queens
- Combinations
- Subsets
- Subsets II
- Palindrome Partitioning
- Combination Sum III
- Target Sum
- Letter Case Permutation
双堆问题
知识原理
把数字分成两半,小的数字放在一起,大的数字放在一起,双堆模式就能高效解决此类问题,一般最大堆和最小堆是常用的两个结构
主要题解
- 优先队列和计划安排问题上有奇效
- 数组中找最大/最小/中位数
- 二叉树数据结构中也有应用
经典例题
子集问题
知识原理
主要是涉及到排列和组合问题。子集问题讲的是用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
原理如图
题解辨析
- 求解排序问题的查找
经典题目(英文)
- Search in Rotated Sorted Array
- Search a 2D Matrix
- Search in Rotated Sorted Array II
- Find Minimum in Rotated Sorted Array
- Find Peak Element
- Count of Range Sum
- Find Smallest Letter Greater Than Target
- Binary Search
- Peak Index in a Mountain Array
TOK-K
知识原理
最佳数据结构就是堆,Java中叫做优先队列
- 根据题目要求,将K个元素插入到最大堆或者最小堆
- 遍历剩下的还没访问的元素,如果当前出来到的这个元素比堆顶元素大,那把堆顶元素先删除,再加当前元素进去
原理如下
主要题解
- 求最大/最小/最频繁的前k个元素
- 排序去找一个特定的数
经典题目
- Kth Kth Largest Element in an Array
- Kth Smallest Element in a BST
- Top K Frequent Elements
- Sort Characters By Frequency
- Course Schedule III
- Find K Closest Elements
- Reorganize String
- Maximum Frequency Stack
- K Closest Points to Origin
多路归并
知识原理
解决涉及到多组排序好的数组问题。
每当你的输入是K个排序好的数组,可以用堆来遍历其中所有数组中的元素。将每个数组中最小的压入到堆,从而得到全局最小值,拿到全局最小值后,再从该元素所在的数组中取下一个元素压入堆。如此处理完所有的元素
解题步骤:
- 把每个数组中的第一个元素都加入最小堆中
- 取出堆顶元素(全局最小),将该元素放入排好序的结果集合里面
- 将刚取出的元素所在的数组里面的下一个元素加入堆
- 重复步骤2,3,直到处理完所有数字
原理如下
主要题解
- 输入是排序好的数组、链表或者矩阵
- 合并多个排好序的集合,或者找集合中第K小的元素
经典题目
- Merge Two Sorted Lists
- Merge k Sorted Lists
- Find K Pairs with Smallest Sums
- Kth Smallest Element in a Sorted Matrix
- Smallest Range Covering Elements from K Lists
动态规划
知识原理
动态规划问题主要是要求得子问题。即最重要的两个点
- 初始值
- 状态转移方程。dp[i]与dp[i-1]甚至dp[i-2]之间的关系
主要题解
- 下一个输出依赖上一个输出
- 求最优解
经典题目
- Longest Palindromic Substring
- Maximum Subarray
- Jump Game
- Unique Paths
- Climbing Stairs
- Decode Ways
- Best Time to Buy and Sell Stock
- Word Break
- Maximum Product Subarray
- House Robber
- House Robber II
- Longest Increasing Subsequence
- Range Sum Query - Immutable
- Best Time to Buy and Sell Stock with Cooldown
- Coin Change
- Counting Bits
- Combination Sum IV
- Partition Equal Subset Sum
- Palindromic Substrings
- Number of Longest Increasing Subsequence
- Partition to K Equal Sum Subsets
拓扑排序
知识原理
用来寻找一种线性的顺序,这些元素之间有依赖性。比如事件B依赖于事件A,那么A在拓扑排序中排在B的前面
解题顺序如下:
- 初始化
- 借助于hashmap将图保存成邻接表的形式
- 找到所有的起点,用hashmap来帮助记录每个点的入度
- 创建图
- 利用输入,把图建好,然后遍历一遍图,将入度信息记录在hashmap中
- 找到所有的起点
- 所有入度为0的节点,都是有效的起点,而且我们将他们都加入到一个队列中
- 排序
- 对于每个起点,执行以下步骤
- 把它加入到结果的顺序中
- 将其在图中的孩子节点取到
- 将其孩子的入度减1
- 如果孩子的入度为0,则改孩子为起点,将其加入队列
- 重复上述过程,直到队列为空
原理如图
主要题解
- 待解决的问题需要处理无环图
- 以一种有序的秩序更新输入元素
- 需要处理的输入遵循某种特定的顺序
经典题目
图论算法
知识原理
图论算法主要是深度优先搜索和广度优先搜索,其大部分的解决方法都与树类似,具体不多展开
题解辨析
- 明显就是图论的算法题
经典题目
来源:oschina
链接:https://my.oschina.net/znfang/blog/4314950