Leetcode 50到75题题目选讲

53. 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

枚举子序列的头和尾,求和,可以有O(N^3)的做法,很容易改进到O(N^2)做法,动态规化可以优化到O(N)

令dp[i] 表示以i结尾的最大子列和

转移方程有dp[i+1] = max(dp[i]+nums[i],nums[i])

54. 螺旋矩阵 / 59. 螺旋矩阵 II

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

这是一道经典的模拟题目,使用常用的方形四周遍历算法,一旦碰到墙壁就换下一种做法,直到不能遍历为止。

55. 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

这道题目最直接的做法是动态规化,bool dp[i] 表示是否能跳到第i个格点

转移方程为dp[i] = true if dp[j] = true and i-j<=num[j]

这么做的时间复杂是O(N^2)

还有一种贪心算法,每次记录当前格点能跳到的最远距离(前提是这个格点能跳到), 最后判断结点是否大于终点。时间复杂是O(N)

56. 合并区间

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

这是一道较难的模拟题目,首先按区间左端点排序,然后进行合并过程

62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径

这是一个经典的动态规化问题,计dp[i]][j] 为走到i,j格点的路径数。

dp[i][j] = dp[i-1][j] + dp[i][j-1]以及边界条件是dp[0][j]=1, dp[i][0]=1

63. 不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

这个是前面的版本有障碍物的简单推广

和前面的方法一样,计dp[i]][j] 为走到i,j格点的路径数,dp[i][j] = dp[i-1][j] + dp[i][j-1] if nums[i][j]=0

64. 最小路径和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

利用动态规化方法,令dp[i][j]表示走到i,j格点数字总和最小的值

状态转移方程dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + nums[i][j]

边界条件只能从一个反向转移过来

69. x 的平方根

实现 int sqrt(int x) 函数。

使用一个简单的二分算法即能解决

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

经典的动态规化问题,dp[i] 表示爬到第i级楼梯。 dp[i]  = dp[i-1] + dp[i-2];

 

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/89646134