LeetCode 汇总

时间:2020-07-12
本文章向大家介绍LeetCode 汇总,主要包括LeetCode 汇总使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

LeetCode 总结

2.两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

类型:链表 要点:处理进位,链尾空处理方式
link

3.无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

关键词:不含重复,最长子串
思路:
求满足某个条件的最长子串,最naive的方法就是遍历子串长度,暴力搜索,但是很多题目提交会超时,因此考虑减小搜索空间。
使用双指针,维护左右指针之间的状态,判断是否满足条件更新结果,然后移动指针,更新状态。
类型:双指针
要点:--
link

5.最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

思路:动态规划,
dp[i][j] 记录 s[i:j] 是不是一个回文串,判断回文串满足以下2个条件

s[i] = s[j]
s[i+1:j-1] 是一个回文串,这里用一个条件判断 i+1 >= j-1, 初始化 长度为1 和 长度为0 的串为回文串

关键词:最长,回文子串
思路:
求满足某个条件的最长子串,最naive的方法就是遍历子串长度,暴力搜索,但是很多题目提交会超时,因此考虑减小搜索空间。
回文子串是满足递推关系的,要判断s[i:j]是不是回文串,只需要判断s[i] == s[j]且s[i+1:j-1]是回文串。
类型:动态规划
要点:二维数组保存子串是否为回文串结果,子串长度为1时,长度为2时,长度大于2时分别判断
link

11.盛最多水的容器

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。
在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49

关键词:
思路:设置左右双指针,每次比较ans与当前区域面积,移动左右指针中长度小的一个(短板)
类型:双指针
要点:--
link

15.三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?
请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。

关键词:是否存在
思路:查找数组里满足某个条件(和为0)的3个元素,对数组排序后,使用双指针减少搜索空间
类型:双指针,循环移动flag,设置L和R指针从两头向中间搜索
要点:排除重复三元组:数组排序后,如果当前flag与上一个flag相同,则直接跳过, L或R指针指向的元素与上一个位置相同,则跳过
link

16.最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
通过次数133,469提交次数291,587

关键词:找出
思路:双指针,与15题类似,不用考虑去重
类型:双指针
要点:--
link

***17.电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

{'2':'abc','3':'def','4':'ghi',
'5':'jkl','6':'mno','7':'pqrs',
'8':'tuv','9':'wxyz'}

关键词:字母组合
思路:组合问题,使用深度优先搜索或广度优先搜索
类型:回溯、搜索
要点:dfs、bfs模板按照题目要求模拟一遍,帮助回忆思路,(不需要考虑去重:ab与ba按不同字符串考虑)

link

18.四数之和

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:
答案中不可以包含重复的四元组。

示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

思路:查找数组中满足某种条件的元素,与三数之和类似,设置flag1,flag2,2重循环flag1和flag2,移动左右指针
类型:双指针
要点:排除重复四元组,剪枝

link

19.删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:
给定的 n 保证是有效的。

进阶:
你能尝试使用一趟扫描实现吗?
关键词:   
思路:   
类型:--   
要点:--  

link

***24.两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.

关键词:链表,交换节点
思路:记录新的头节点,设置pre_pre,pre, cur 三个辅助指针,然后按照逻辑交换节点,判断链表长度为奇数和偶数的情况
类型:链表
要点:辅助指针,节点交换逻辑,在更新pre和cur指针前先判断边界条件

link

25. K 个一组翻转链表(hard)

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

关键词:链表翻转
思路:先遍历求链表长度,然后对每一段调用辅助翻转函数处理
类型:链表
要点:分段起始位置,辅助链表翻转函数设计:参数,翻转逻辑(优化方法:辅助函数返回该段的头尾节点)

link

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

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置
你的算法时间复杂度必须是 O(log n) 级别
如果数组中不存在目标值,返回 [-1, -1]。

示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

关键词:排序数组,元素查找,O(log n)
思路:从头尾开始,二分查找,注意结束条件。
类型:--   
要点:--  

link

37.解数独(hard)

编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。
Note:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。

关键词:   
思路:   
类型:回溯算法
要点:--  

link

39.组合总和

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。

说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。 
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]

示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

关键词:组合,元素和为target
思路:深度优先搜索,先对数组排序,减小搜索空间
类型:回溯
要点:可重复选取,递归时传入当前位置i

link

40.组合总和II

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。

说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。 
示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]

示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
  [1,2,2],
  [5]
]
关键词:   
思路:要求不能重复,递归时位置参数传i+1,并且当i>0时,判断candidates[i]==candidates[i-1]
类型:--   
要点:--  

link

43.字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"

说明:
1、num1 和 num2 的长度小于110。
2、num1 和 num2 只包含数字 0-9。
3、num1 和 num2 均不以零开头,除非是数字 0 本身。
4、不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

关键词:   
思路:用result = [0] * (len(num1) + len(num2))记录结果,从前往后双重循环遍历两个字符串中的每个数字,处理乘积和进位
类型:字符串
要点:--  

link

**46. 全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
关键词:   
思路:   
类型:
要点:--  

link

71.简化路径

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

示例 1:
输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。

示例 2:
输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。

示例 3:
输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例 4:
输入:"/a/./b/../../c/"
输出:"/c"

示例 5:
输入:"/a/../../b/../c//.//"
输出:"/c"

示例 6:
输入:"/a//b////c/d//././/.."
输出:"/a/b/c"
关键词:   
思路:   
类型:--   
要点:--  

link

92.反转链表-ii

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

关键词:   
思路:   
类型:--   
要点:--  

link

200.岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

示例 1:
输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1

示例 2:
输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

关键词:   
思路:   
类型:dfs,bfs
要点:--  

link

206.反转链表

反转一个单链表。
关键词:   
思路:   
类型:--   
要点:--  

link

235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
关键词:   
思路:   
类型:--   
要点:--  

link

236.二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
关键词:   
思路:   
类型:--   
要点:--  

link

260.只出现一次的数字 III

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]

注意:
1、结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
2、你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

关键词:   
思路:先找到两个元素异或为1的位,然后以此位为1和0分别求解
类型:位运算
要点:--  

link

**560.和为K的子数组

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

说明 :
数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

关键词:连续子数组的和
思路:前缀数组
类型:哈希表
要点:前缀数组第一个位置初始化1

link

567.字符串的排列

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").

示例2:
输入: s1= "ab" s2 = "eidboaoo"
输出: False

注意:
输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间

关键词:子串,排列之一
思路:
    如果两个字符串的元素组成相同,则排列存在相同;
    问题转化成:找s2中是否有子串与s1的元素组成相同,对于子串问题,这里可以使用双指针
    另外要注意把指针移动位置分析清楚
类型:双指针
要点:--  

link

698.划分为k个相等的子集

给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。

提示:
1 <= k <= len(nums) <= 16
0 < nums[i] < 10000

关键词:   
思路:   
类型:--   
要点:--  

link

763.划分字母区间

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。

示例 1:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

提示:

S的长度在[1, 500]之间。
S只包含小写字母 'a' 到 'z' 。
关键词:   
思路:   
类型:--   
要点:--  

link

**795.区间子数组个数

给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。

求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。

例如 :
输入:
A = [2, 1, 4, 3]
L = 2
R = 3
输出: 3
解释: 满足条件的子数组: [2], [2, 1], [3].
注意:

L, R 和 A[i] 都是整数,范围在 [0, 10^9]。
数组 A 的长度范围在[1, 50000]。 
关键词:   
思路:   
类型:--   
要点:--  

link

**930.和相同的二元子数组

在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组。

示例:
输入:A = [1,0,1,0,1], S = 2
输出:4
解释:
如下面黑体所示,有 4 个满足题目要求的子数组:
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]

提示:
A.length <= 30000
0 <= S <= A.length
A[i] 为 0 或 1
关键词:   
思路:   
类型:--   
要点:--  

link

aaa


关键词:   
思路:   
类型:--   
要点:--  

link

aaa


关键词:   
思路:   
类型:--   
要点:--  

link

aaa


关键词:   
思路:   
类型:--   
要点:--  

link

aaa


关键词:   
思路:   
类型:--   
要点:--  

link

aaa


关键词:   
思路:   
类型:--   
要点:--  

link

aaa


关键词:   
思路:   
类型:--   
要点:--  

link

原文地址:https://www.cnblogs.com/sandy-t/p/13287247.html