详细解题: https://blog.csdn.net/u014256231/article/details/83514830
题目大意: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2] ]
解题思路1: 先排序,因为结果是三数和为0. 最小的数一定是负数或0. 固定一个数 i,j = i + 1, k = len(nums) - 1, 求三个数的和。如果小于0,说明数需要大些,就把就j+1. 如果大于0,把k-1. 直到相遇。
详细解题: https://blog.csdn.net/u014256231/article/details/83552155
题目大意: 找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解题思路1: 先排序,固定一个数i,遍历另两个数 j = i + 1,k = len(nums) - 1
while j<k:
temp = nums[i] + nums[j] +nums[k]
if abs(res - target) > abs(temp-target):
res = temp
if target < temp:
k-=1
else:
j+=1
详细解题: https://blog.csdn.net/u014256231/article/details/83592649
题目大意: 判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
解题思路1: 在3sum基础上增加个循环,固定两个数,找另两个数。可以通过固定数字判断出可能的最大和和最小和的范围,判断target是否在此范围内,筛选边缘组合加速。
详细解题: https://blog.csdn.net/u014256231/article/details/83689367
题目大意: 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
【输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4】
解题思路1: 先判断当前mid的位置,分别做判断。比方[5671234],tar=2。 mid = 1,此时,如果target在1-4之间,取右半边;target小于1或者大于4在左边。
解题思路2: 计算mid的时候,不同情况下赋值成inf,或者-inf;就可以直接做二分查找了。
详细解题: https://blog.csdn.net/u014256231/article/details/83721018
题目大意: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
输入: candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]
解题思路: 回溯 dfs(candidates, target-res[i], i, path+[res[i]], result)
详细解题: https://blog.csdn.net/u014256231/article/details/83759375
题目大意: 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。解集不能包含重复的组合。
【输入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为:[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
解题思路1: 同上题,注意下不能重复+每个数只能用一次就好了
详细解题: https://blog.csdn.net/u014256231/article/details/83826057
题目大意: 给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。
给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ]
解题思路1: 把matrix先reverse一下,再zip(*)
matrix[::-1] <==> matrix.reverse()
解题思路2: 先reverse一下,[[1 2 3],[4 5 6],[7 8 9]]的原矩阵变为[[7 8 9],[4 5 6],[1 2 3]]. 再沿着左上到右下的切线把矩阵对称翻转
详细解题: https://blog.csdn.net/u014256231/article/details/83830786
题目大意: 给定一个包含 m x n 个元素的矩阵,按照顺时针螺旋顺序,返回矩阵中的所有元素。
【输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出:[1,2,3,6,9,8,7,4,5]】
解题思路:
return matrix and list(matrix.pop(0)) + self.buildTree(zip(*matrix)[::-1])
详细解题: https://blog.csdn.net/u014256231/article/details/83834258
题目大意: 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。
【输入: [2,3,1,1,4] 输出: true】 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
解题思路1: 正序遍历,stepsLeft从index=1开始遍历,表示还可以最多走几步,如果等于0,就停了。stepsLeft = max(stepsLeft - 1, num) == 0时,False。
解题思路2: 逆序遍历,从倒数第二个数开始逆序遍历 last表示目前倒序能到达结尾的最大序号 if i + nums[i] >= last: last = i,最后last == 0,True
详细解题: https://blog.csdn.net/u014256231/article/details/83859428
题目大意: 给出一个区间的集合,请合并所有重叠的区间。
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]]
解释: 区间[1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
解题思路: 先按照第一个数的大小排序,遍历一遍,判断每个区间是否和上一个区间有交集。比如[[1,3],[2,5]] 3比2大,有交集,就把[1,3]的3赋值为max(3,5),把[2,5]pop掉。
详细解题: https://blog.csdn.net/u014256231/article/details/83861849
题目大意: 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
解题思路: 先给9,然后每次把矩阵顺时针旋转,顶部push新一行
详细解题: https://blog.csdn.net/u014256231/article/details/83865043
题目大意: 一个机器人位于一个 m x n 网格的左上角。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,问总共有多少条不同的路径?
输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。
解题思路: 遍历一遍,每个格子的可能路径数 = 左边格子的路径数 + 上面格子的路径数
详细解题: https://blog.csdn.net/u014256231/article/details/83866591
题目大意: 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。
解题思路1: 遍历的时候,如果是0就不赋值了。或者用上面的数加左边的数 * (1 - obstacleGrid[i][j])
详细解题: https://blog.csdn.net/u014256231/article/details/83867324
题目大意: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
解题思路1: 每个位置记录到达这个点的最小和+这个点的值 = 到达这个点的最小和
详细解题: https://blog.csdn.net/u014256231/article/details/83870123
题目大意: 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
解题思路1: 先记录有0的行数和列数,再分别把该行、列置零
解题思路2: 迭代原始数组,如果我们找到一个条目,比如说cell[i][j]是0,那么我们分别迭代行i和列j,并将所有非零元素设置为一些高负虚拟值(比方说-1000000)。最后,我们迭代原始矩阵,如果我们发现一个条目等于高负值,那么我们将单元格中的值设置为0。
详细解题: https://blog.csdn.net/u014256231/article/details/83895952
题目大意: 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。矩阵每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。
解题思路1: 先找到这个数可能在的那行,再二分查找,找到了return True,找不到return False
解题思路2: 相当于把所有的数抽成一行,二分查找。实现的时候是定了mid后,在原矩阵中找mid对应的位置
详细解题: https://blog.csdn.net/u014256231/article/details/83896691
题目大意: 排序 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]
解题思路1: 遍历一遍,如果是0,就插在开头,i指向下个数;如果是1,就直接指向下个数;如果是2,就插到末尾。num_2记录2的个数,也就是while的循环停止时间。
详细解题: https://blog.csdn.net/u014256231/article/details/83989108
题目大意: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
解题思路1: 对于每一个数,都是把所有当前集合append这个数,再append之前的所有集合。比如刚开始是[],来了一个1,[],[1] -> [],[1],[2],[1,2] -> [],[1],[2],[1,2],[3],[1.3],[2,3],[1,2,3]
解题思路2: 比如[1,2,3],有2^3个子集,0-7的所有二进制表示比方5是101,则此时表示子集是[1,3]
详细解题: https://blog.csdn.net/u014256231/article/details/83994401
题目大意: 给定一个二维网格和一个单词,找出该单词是否存在于网格中。
解题思路: 递归,判断当前的字母是否是word里的首字母
详细解题: https://blog.csdn.net/u014256231/article/details/83996856
题目大意: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
解题思路: 双指针,一个指针一直走,一个指针指向赋值的位置,赋值的情况是nums[j] > nums[i-2]
详细解题: https://blog.csdn.net/u014256231/article/details/84030414
题目大意: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
解题思路1: 和4>类似,具体看链接里吧
详细解题: https://blog.csdn.net/u014256231/article/details/83999435
题目大意: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集。
输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
解题思路1: [1,2,2,2]举例 [] -> [] [1] -> [] [1] [2] [1,2] -> 此时只append后1/2 [] [1] [2] [1,2] [2,2] [1,2,2] -> 此时只append后2/3 [] [1] [2] [1,2] [2,2] [1,2,2] [2,2,2] [1,2,2,2],则重复出现时,如果出现第二次,遍历从len(all_subsets) *1/2开始,出现第三次,遍历从len(all_subsets) *2/3开始
详细解题: https://blog.csdn.net/u014256231/article/details/84001133
题目大意: 根据一棵树的前序遍历与中序遍历构造二叉树。
解题思路1: 前序的第一个数是根结点,在中序中找到该数字,左边是左枝,右边是右枝。
详细解题: https://blog.csdn.net/u014256231/article/details/84001367
题目大意: 根据一棵树的【中序遍历】与【后序遍历】构造二叉树
解题思路1: 后序的最后一个数是根结点
前序:上左右 中序:左上右 后序:左右上
详细解题: https://blog.csdn.net/u014256231/article/details/84031434
题目大意: 给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
解题思路: 在triangle矩阵里用min(triangle[i-1][j-1], triangle[i-1][j]) + triangle[i][j] 赋值给triangle[i][j],最后最后一行的最小值即为所求。