LeetCode 汇总
时间:2020-07-12
本文章向大家介绍LeetCode 汇总,主要包括LeetCode 汇总使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
LeetCode 总结
目录
- LeetCode 总结
- 2.两数相加
- 3.无重复字符的最长子串
- 5.最长回文子串
- 11.盛最多水的容器
- 15.三数之和
- 16.最接近的三数之和
- ***17.电话号码的字母组合
- 18.四数之和
- 19.删除链表的倒数第N个节点
- ***24.两两交换链表中的节点
- 25. K 个一组翻转链表(hard)
- 34.在排序数组中查找元素的第一个和最后一个位置
- 37.解数独(hard)
- 39.组合总和
- 40.组合总和II
- 43.字符串相乘
- **46. 全排列
- 71.简化路径
- 92.反转链表-ii
- 200.岛屿数量
- 206.反转链表
- 235. 二叉搜索树的最近公共祖先
- 236.二叉树的最近公共祖先
- 260.只出现一次的数字 III
- **560.和为K的子数组
- 567.字符串的排列
- 698.划分为k个相等的子集
- 763.划分字母区间
- **795.区间子数组个数
- **930.和相同的二元子数组
- aaa
- aaa
- aaa
- aaa
- aaa
- aaa
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按不同字符串考虑)
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,移动左右指针
类型:双指针
要点:排除重复四元组,剪枝
19.删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
关键词:
思路:
类型:--
要点:--
***24.两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
关键词:链表,交换节点
思路:记录新的头节点,设置pre_pre,pre, cur 三个辅助指针,然后按照逻辑交换节点,判断链表长度为奇数和偶数的情况
类型:链表
要点:辅助指针,节点交换逻辑,在更新pre和cur指针前先判断边界条件
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
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
关键词:链表翻转
思路:先遍历求链表长度,然后对每一段调用辅助翻转函数处理
类型:链表
要点:分段起始位置,辅助链表翻转函数设计:参数,翻转逻辑(优化方法:辅助函数返回该段的头尾节点)
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)
思路:从头尾开始,二分查找,注意结束条件。
类型:--
要点:--
37.解数独(hard)
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。
Note:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
关键词:
思路:
类型:回溯算法
要点:--
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
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]
类型:--
要点:--
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))记录结果,从前往后双重循环遍历两个字符串中的每个数字,处理乘积和进位
类型:字符串
要点:--
**46. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
关键词:
思路:
类型:
要点:--
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"
关键词:
思路:
类型:--
要点:--
92.反转链表-ii
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
关键词:
思路:
类型:--
要点:--
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
要点:--
206.反转链表
反转一个单链表。
关键词:
思路:
类型:--
要点:--
235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
关键词:
思路:
类型:--
要点:--
236.二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
关键词:
思路:
类型:--
要点:--
260.只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:
1、结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
2、你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
关键词:
思路:先找到两个元素异或为1的位,然后以此位为1和0分别求解
类型:位运算
要点:--
**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
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的元素组成相同,对于子串问题,这里可以使用双指针
另外要注意把指针移动位置分析清楚
类型:双指针
要点:--
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
关键词:
思路:
类型:--
要点:--
763.划分字母区间
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示:
S的长度在[1, 500]之间。
S只包含小写字母 'a' 到 'z' 。
关键词:
思路:
类型:--
要点:--
**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]。
关键词:
思路:
类型:--
要点:--
**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
关键词:
思路:
类型:--
要点:--
aaa
关键词:
思路:
类型:--
要点:--
aaa
关键词:
思路:
类型:--
要点:--
aaa
关键词:
思路:
类型:--
要点:--
aaa
关键词:
思路:
类型:--
要点:--
aaa
关键词:
思路:
类型:--
要点:--
aaa
关键词:
思路:
类型:--
要点:--
原文地址:https://www.cnblogs.com/sandy-t/p/13287247.html
- 串口通信控制器的Verilog HDL实现(二) 波特率发生器模块
- 串口通信控制器的Verilog HDL实现(一) 顶层模块
- 双口同步RAM
- 单口RAM
- Python 基础:类与函数
- 论 Python 装饰器控制函数 Timeout 的正确姿势
- 巧用 SecureCRT 实现复杂的 ssh 登录过程自动化
- pyDes 实现 Python 版的 DES 对称加密/解密
- 流水灯
- Chrome 自动化交互利器:用 tampermonkey 向页面注入自定义 Javascript
- 一次小折腾:PyCharm 调用 Cygwin Python 找不到 time、sys 等内置模块
- 网站数据统计分析之二:前端日志采集是与非
- Linux Shell 从入门到删除根目录跑路指南
- SSD Win8 系统盘 4K 无损对齐历险记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 机器学习4个常用超参数调试方法!
- 总结:DCIC算法分析赛完整方案分享!
- 提高微服务安全性的11个方法
- nmap
- MSF基础与应用
- Windows系统组件漏洞
- 【风险通告】FastAdmin会员中心Getshell漏洞
- Azure Cosmos DB介绍及演示
- 从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta
- 《一起学sentinel》一、一起搭建sentinel服务
- InfluxDB和Grafana实现传感器数据的存储和可视化
- 样本相关性分析
- Android 序列化 Serializable与Parcelable
- 《一起学sentinel》二、初探sentinel的Slot
- Redis突然报错,今晚又不能回家了...