给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
枚举子序列的头和尾,求和,可以有O(N^3)的做法,很容易改进到O(N^2)做法,动态规化可以优化到O(N)
令dp[i] 表示以i结尾的最大子列和
转移方程有dp[i+1] = max(dp[i]+nums[i],nums[i])
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
这是一道经典的模拟题目,使用常用的方形四周遍历算法,一旦碰到墙壁就换下一种做法,直到不能遍历为止。
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
这道题目最直接的做法是动态规化,bool dp[i] 表示是否能跳到第i个格点
转移方程为dp[i] = true if dp[j] = true and i-j<=num[j]
这么做的时间复杂是O(N^2)
还有一种贪心算法,每次记录当前格点能跳到的最远距离(前提是这个格点能跳到), 最后判断结点是否大于终点。时间复杂是O(N)
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
这是一道较难的模拟题目,首先按区间左端点排序,然后进行合并过程
一个机器人位于一个 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
一个机器人位于一个 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
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
利用动态规化方法,令dp[i][j]表示走到i,j格点数字总和最小的值
状态转移方程dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + nums[i][j]
边界条件只能从一个反向转移过来
实现 int sqrt(int x)
函数。
使用一个简单的二分算法即能解决
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
经典的动态规化问题,dp[i] 表示爬到第i级楼梯。 dp[i] = dp[i-1] + dp[i-2];