leetcode刷题总结51-100
51.52 N皇后问题
描述:
思路: 回溯
53. 最大子序和
描述:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
思路: 动态规划。状态变量dp[i]表示当前第i个元素的最大子序和。dp[i]=max(dp[i-1],0)+num[i]
54. 螺旋矩阵
描述:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
思路:按照读取的顺序依次遍历。(可以通过一种flag和递归。一趟递归为1-2-3-6-9-8-7-4)
55. 跳跃游戏
描述:
输入: [2,3,1,1,4]
输出: true1
思路: 动态规划.状态变量dp[i]表示第i个台阶最少需要的次数。当在第一个台阶2的时候,决定了dp[1]=1,dp[2]=1,当到了第二个,dp[2]=min(dp[2]+dp[1]+1)
56. 合并区间
描述:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
思路: 按照左边进行排序,然后开始遍历即可。采用一个指针记录当前最大的右边界,用于判断下一个左边界是否小于当前最大的有边界。
57. 插入区间
描述:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
思路: 同56。
58. 最后一个单词的长度
描述:
输入: "Hello World"
输出: 5
思路: 两个指针,一个指针从后往前,遇到第一个不为空的,为end,然后start从end开始往前,遇到一个的空停止。
59. 螺旋矩阵
描述:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路: 先生成一个n*n的空矩阵,按照思路生成填充即可。
60. 第k个排列
描述:
输入: n = 3, k = 3
输出: "213"
解释:
"123"
"132"
3. "213"
"231"
"312"
"321"
思路:回溯j+剪枝。比如第1个字符为”1“的时候,那么剩余2,3字符,排列为A2=2,3-2=1>0,那么就不可能出现在以1开始的字符串,开始2。。。。
61. 旋转链表
描述;
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
思路: 先遍历一遍,建立一个单项循环链表,然后头指针往后走k个,决定新的头指针和尾指针。。。。
62. 不同路径
描述:
思路: 动态规划
63. 不同路径 II
描述: 有障碍物的62题
思路:动态规划
64. 最小路径和
描述:有权重的62题
思路:动态规划
65. 有效数字
描述:
”99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false
思路: 3个变量,一个是e的falg,一个是符号的flag,一个是num的flag不断往后遍历设置值
66. 加一
描述:
输入: [1,2,3]
输出: [1,2,4]
思路: 从后往前+1,进位初始0
67. 二进制求和
描述:
输入: a = "11", b = "1"
输出: "100"
思路: 从后往前相加,进位初始0
68. 文本对齐
描述:
输入:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
输出:
[
"This is an",
"example of text",
"justification. "
]
思路:贪心,一行最大的单词个数
69. x的平方根
描述:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去
思路:二分
70.爬楼梯
动态规划。。
71. 简化路径
描述:
输入:"/a/../../b/../c//.//"
输出:"/c"
思路: 从前往后遍历判断即可。
72. 编辑距离
动态规划
73. 矩阵置0
描述:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
思路:遍历图中,把需要改为0的地方修改成固定的我们设定的值,-1000000.然后第二遍遍历的时候直接把这个数改为0.
74. 搜索二维矩阵
描述:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
思路:从23开始判断,小于开始遍历此行,小于继续走上一行的第一个元素判断。(排场一行后,二分也可以)
75. 颜色分类
描述:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
思路: 一个current指针,一个p0指向第一个,p2指向最后一个,当nums[current]=0,则与p0交换;=2与p2交换,=1右移
While curr <= p2 :
若 nums[curr] = 0 :交换第 curr个 和 第p0个 元素,并将指针都向右移。
若 nums[curr] = 2 :交换第 curr个和第 p2个元素,并将 p2指针左移 。
若 nums[curr] = 1 :将指针curr右移。
76. 最小覆盖子串
描述:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
思路:滑动窗口
77. 组合
描述:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思路:回溯
78. 子集
描述:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路: 递归。从【】的子集是[],【1】是【】的子集中都添加1+【】
79. 单词搜索
描述:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
思路:先找到第一个字符的位置,然后开始上下左右找第二三四。。。。注意边界,。
80. 删除排序数组中的重复项 II
描述:每个元素最多出现两次
给定 nums = [0,0,1,1,1,1,2,3,3],
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
思路:两个指针和一个计数器即可。
81. 搜索旋转排序数组
描述:
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
思路:二分
82. 删除排序链表中的重复元素 II
描述:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
思路:第一个指针为第一个数字前的一个,第二个用于判断是否重复
83. 删除排序链表中的重复元素
描述:
输入: 1->1->2
输出: 1->2
思路:雷同82
84. 柱状图中最大的矩形
描述:
思路:单调栈
85. 最大矩形
描述:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
思路:动态规划。dp[i][j][0]=dp[i-1][j][0]+1(nums[i][j]w==1)从当前节点能往左走多少个点。。。dp[i][j][1]不熬是往上
86. 分隔链表
描述:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
思路:修改指针即可;或者分成两个链表(一个是小于3,一个大于,然后合并)
87. 扰乱字符串
描述:
输入: s1 = "great", s2 = "rgeat"
输出: true
思路: 动态规划即可。dp[i]][j][len]表示s1从i开始和s2从j开始的长度为len是否可以变换。左子树和右子树交换相等还是左子树等于右子树
88. 合并两个有序数组
描述:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
思路: 从后往前。
89. 格雷编码
90. 子集 II
描述:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
1,2],
[]
]
思路:回溯。
91. 解码方法
描述:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
思路: 动态规划
92. 反转链表 II
描述:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
思路:指针走到m-1开始记录,将m~n采用插入的方式。
93. 复原IP地址
描述:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
思路: 回溯+剪枝
94. 二叉树的中序遍历
描述:
思路:递归 左中右;栈
95. 不同的二叉搜索树 II
描述:
思路:回溯
96. 不同的二叉搜索树
描述:
思路:卡特兰数
97. 交错字符串
描述:
输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出: true
思路:动态规划。dp[i][j]表示s1[i]与s2[j]能否构成s3的i+j
98. 验证二叉搜索树
描述:
思路: 递归。
99. 恢复二叉搜索树
描述:
思路:先通过中序找到哪两个节点位置不对,交换即可。
100. 相同的树
描述:判断两个树是否一样。
思路:递归 判断根节点