leetcode刷题总结1-50
1. 两数之和
描述:nums = [2, 7, 11, 15], target = 9 返回[0, 1]
思路:双指针,一个从前,一个从后。(数组必须排序)
2. 两数相加
描述:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:通过最低位开始和进位(init:0)相加。时间复杂度O(max(m,n))
3. 无重复字符的最长字串
描述:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路: 快指针和慢指针,hashmap结构<char,index>
4. 寻找两个正序数组的中位数。(放弃)
描述:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
思路:转换为找第i个小的数,分别找两个数组的i/2个小的数,比较边界,动态变换两个切点的位置。
5. 最长回文子串
描述:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
思路:动态规划。定义状态变量dp[i][j]为子串i~j是否为回文。dp[i][j]=dp[i+1][j-1] AND i==j?
6. Z字形变换
描述:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
思路: 定义numRows数组,来一个字符放入,(放入的时候按照一定规律)
7. 正数反转
描述:123=>321 -123=> -321 120=>21
思路: 通过相除取余10,不断计算累加。
8. 字符串转换整数
描述: "42"->42 ; " -42"->"-42" ; "words and 987" => "" ; "4193 with words"=>"4193"
思路: 自动机判断即可
9. 回文数
描述:
输入: 121
输出: true
思路:转变为字符串比较;
10.正则表达式匹配
描述: 一定规则的正则匹配
思路: 动态规划
11. 装最多水的容器。
描述:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
思路:双指针,一个开始,一个尾,开始计算靠紧。
12. 整数转罗马数字
描述:
输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路:不断与对应的罗马数字相减。存储映射关系。
13. 罗马数字转整数:
描述:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路:计算累加。注意V与VI
14. 最长公共前缀
描述:
输入: ["flower","flow","flight"]
输出: "fl"
输入: ["dog","racecar","car"]
输出: ""
思路:比较即可。
15 . 三数之和
描述:
给定数组 nums = [-1, 0, 1, 2, -1, -4], target=0
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路: 排序 + 先固定第一个指针,然后双指针从第二个位置和尾指针遍历。
16. 最接近的三数之和
类比 三数之和
17. 电话号码的字母组合
描述:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路: 回溯+深度优先
18. 四数之和
类比 三数之和 n^3
19. 删除链表的倒数第N个节点
描述;
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路:时间复杂度)(n),设两个指针,都从头开始,第二个指针和第一个距离保持n的长度,当第二个为Null,证明已经到尾了,那么第一个就在被删除节点的前一个。
20. 有效的括号
描述:
输入: "()[]{}"
输出: true
思路: 栈
21. 合并两个有序链表
描述:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:合并即可
22. 括号生成
描述:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路: 回溯
23 合并K个排序链表
描述:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路:归并,每2个采用 “ 21. 合并两个有序链表”
24. 两两交换链表中的节点
描述:给定 1->2->3->4, 返回 2->1->4->3.
思路:类比下一题
25. K个一组交换
描述:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
思路:
采用3个指针,一个指head,一个慢慢往后走,另一个是第二个的后一个,逐渐往后修改。到K个后,修改head和end,即end为下一个递归的head
26. 删除排序数组中的重复项
描述:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
思路:快指针慢指针。
27. 移除元素
描述:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
思路:快指针慢指针
28. 实现Strstr()
描述:
输入: haystack = "hello", needle = "ll"
输出: 2
思路:KMP (next数组)
29. 两数相除
描述:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
思路:被除数翻倍,10能除过3,那么除6,否则再除12....当除不过的时候再去这个区间划分。
30. 串联所有单词的子串
描述:
输入:
s = "barfoothefoobarman",
words = ["foo","bar"]
输出:[0,9]
思路:先把words的单词和个数放入hashmap,然后通过s的窗口滑动完成搜。(窗口的长度与words字符个数相同,窗口也采用hashmap的统计方式)
31. 下一个排列:
描述:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路:从大到小排序;从后往前找突然变小的,然后交换此数字和后面比他大的最小的。然后将那个突然变小的后面倒序。(1576432)->将5和6交换(1675432)倒序75432->1623457
32. 最长有效括号:
描述:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
思路:栈
33. 搜索旋转排序数组
描述:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
思路:二分查找。看那一半的两边是否递增。
34. 在排序数组中查找元素的第一个和最后一个位置
描述:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
思路: 二分
35. 搜索插入位置
描述:
输入: [1,3,5,6], 5
输出: 2
思路:二分
36. 有效的数独
描述:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
输出: true
思路: 从上到下,从左到右,三维数组(第一个是原数组的行,第二个是原数组的列,第三个是所属的Block,检测当前block是否已存在已存在的)
37. 解数独
描述:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
思路: 回溯(现在[0][2]放1,然后从左往右,发现失败回溯)
38. 外观数组。。。。略
39. 组合总和
描述:(允许重复)
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
思路:回溯
40 .组合总和 II
描述:(不允许重复)
candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
思路:回溯
41. 缺失的第一个正数
描述:
输入: [3,4,-1,1]
输出: 2
思路:创立一个长度为n的数组,遍历一遍,将负数和0扔掉,若当前正数小于n,放在第i位,若大于n,也丢弃。那么这个数组从头到尾遍历即可。
42. 接雨水
描述:
思路:栈(当遇到比当前的相等或者高,那么就可以计算累加了)
43 . 字符串相乘
描述:
输入: num1 = "123", num2 = "456"
输出: "56088
思路:普通的乘法。(“3”-“0”=3)
44.通配符匹配
描述:
输入:
s = "cb"
p = "?a"
输出: false
思路: 通过回溯即可;动态规划,设定状态变量dp[i][j]字符串前i个与模式前j个是否匹配。
45. 跳跃游戏2
描述:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
思路: 动态规划。初始第一个为2,那么将dp[1],dp[2]设为1.第二个为3,那么dp[2]=min(dp[2],dp[1]+1)
46. 全排列
描述:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:递归
47. 全排列 II
描述:(允许输入的数组中有重复,但是保证输出不能有重复)
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路:回溯+剪枝
48. 图像旋转
描述:
输入
[
[1,2,3],
[4,5,6],
[7,8,9]
],
输出
[
[7,4,1],
[8,5,2],
[9,6,3]
]
思路:找规律,1,3,9,7进行变换,然后2,6,8,4...
49. 字母异位词分组
描述:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
思路: hashmap<sorted string,List<source string>>
50. pow(x,n)
描述: x的n次方
思路:不断进行n的除以2的操作,进行x*x或者x*x*y的递归操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)