26. 合并区间(56)
给出一个区间的集合,请合并所有重叠的区间。
示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: 输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路:
27. 不同路径(62)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1: 输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右 示例 2: 输入: m = 7, n = 3 输出: 28
解题思路:
动态规划:第一行与第一列都初始化为1,因为到达这些方格的方法只有一种。
其他方格:dp[i][j]=dp[i-1][j]+dp[i][j-1];
1 class Solution { 2 public: 3 int uniquePaths(int m, int n) { 4 5 if(m<2 || n<2) 6 return 1; 7 8 vector<vector<int>> dp(m,vector<int>(n,1)); 9 for(int i=1;i<m;i++) 10 for(int j=1;j<n;j++) 11 dp[i][j]=dp[i-1][j]+dp[i][j-1]; 12 13 return dp[m-1][n-1]; 14 } 15 };
28. 最小路径和(64)
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。
解题思路:
动态规划:第一行第一列对前面的元素累加
其他方格:dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]
1 class Solution { 2 public: 3 int minPathSum(vector<vector<int>>& grid) { 4 int szx = grid.size(); 5 if(szx<1) 6 return 0; 7 int szy = grid[0].size(); 8 int dp[szx][szy]; 9 10 dp[0][0]=grid[0][0]; 11 for(int i=1;i<szx;i++){ 12 dp[i][0]= grid[i][0] + dp[i-1][0]; 13 } 14 15 for(int i=1;i<szy;i++){ 16 dp[0][i]= grid[0][i] + dp[0][i-1]; 17 } 18 19 for(int i=1;i<szx;i++) 20 for(int j=1;j<szy;j++) 21 dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]; 22 23 return dp[szx-1][szy-1]; 24 } 25 };
29. 爬楼梯(70)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶
解题思路:
动态规划:f(n) = f(n-1) + f(n-2)
初始值:f1=1, f2=2
1 //f(n) = f(n-1) + f(n-2) 2 3 class Solution { 4 public: 5 int climbStairs(int n) { 6 if(n<3) 7 return n; 8 int first = 1, second =2; 9 int res; 10 for(int i=3;i<=n;i++){ 11 res = first + second; 12 first = second; 13 second = res; 14 } 15 16 return res; 17 } 18 };
30. 编辑距离(72)
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例 1: 输入: word1 = "horse", word2 = "ros" 输出: 3 解释: horse -> rorse (将 \'h\' 替换为 \'r\') rorse -> rose (删除 \'r\') rose -> ros (删除 \'e\') 示例 2: 输入: word1 = "intention", word2 = "execution" 输出: 5 解释: intention -> inention (删除 \'t\') inention -> enention (将 \'i\' 替换为 \'e\') enention -> exention (将 \'n\' 替换为 \'x\') exention -> exection (将 \'n\' 替换为 \'c\') exection -> execution (插入 \'u\')
解题思路:
31. 颜色分类(75)
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 - 你能想出一个仅使用常数空间的一趟扫描算法吗?
解题思路:
32. 最小覆盖子串(76)
给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC"
说明:
- 如果 S 中不存这样的子串,则返回空字符串
""。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案。
解题思路:
33. 子集(78)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
解题思路:
34. 单词搜索(79)
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例: board = [ [\'A\',\'B\',\'C\',\'E\'], [\'S\',\'F\',\'C\',\'S\'], [\'A\',\'D\',\'E\',\'E\'] ] 给定 word = "ABCCED", 返回 true. 给定 word = "SEE", 返回 true. 给定 word = "ABCB", 返回 false.
解题思路:
35. 柱状图中最大的矩形(84)
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例: 输入: [2,1,5,6,2,3] 输出: 10
解题思路:
36. 最大矩形(85)
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例: 输入: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] 输出: 6
解题思路: