题目
(0908)买卖股票的最佳时机
知识点:数组,动态规划
难度:简单
题目描述:
- 假设你有一个数组,其中第 i 个元素是股票在第 i 天的价格。
- 你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。
- 示例1
- 输入 [1,4,2]
- 输出 3
代码
1 | public static int maxProfit(int[] prices) { |
(0908)带权值的最小路径和
知识点:数组,动态规划(矩阵)
难度:中等
题目描述:
- 给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。注意:你每次只能向下或向右移动。
1 | public static int minPathSum(int[][] grid) { |
(0909)子数组的最大累加和
知识点:分治,动态规划
难度:简单
题目描述:
- 给定一个数组arr,返回子数组的最大累加和
- 例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
- 要求时间复杂度为\(O(n)\),空间复杂度为\(O(1)\)
理解:问题分为:到某一位为止的最优累加和,和整个数列不同位置为终点的累加和中的最大值(max)。
1 | public int maxsumofSubarray (int[] arr) { |
(0911)LIS最长递增子序列(现解法超时)
知识点:二分,动态规划
难度:中等
题目描述:
- 给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)
目前解法:
arrayCompare
: 先比较长度,再比较字典序DP[length]
: 逐步更新,长度为length的所有子序列中最优解- 从arr第一位到最后一位,每次检查以当前位为最后一位的最长递增子序列
- 检查的方法
searchInsert
:对之前的所有DP[length] (1<=length<=maxlength)
遍历,插入当前位arr[i]
并舍去大于当前位的部分。这部分用到二分查找
。
1 | public class NowCoder_LIS { |
(0911)最大正方形
初始化,
DP = mat
遍历,
包含第[i][j]个结点的最大正方形
状态转移方程:
1
2
3if mat[i][j] == 1{
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1;
}
1 | import java.util.*; |
(1117) NC127最长公共子串 LCS
- DP[i][j]: 以第i、j个字符为结尾的最长公共子串
1 | import java.util.Arrays; |
- 样例结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17startIdx: 10, endIdx: 14
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]
CDEFG