leetcode 最大子序列和:
首先想到的就是最大子序列和 ,题目只要求最初最大子序列的和,能够想到的是还能变为求最大子序列
实际上能够想到的最简单的就是求最大子序列和,就是最大值,负值直接跳过,保持最大值就可以,不由就能想到 num[i] < 0 的都可以去掉 也就是 num[i] + num[i+1] 和 num[i+1]做比较 取最大值;
因此我们能够想到 动态规划转移方程: f(i) = MAX(f(i-1)+nums[i],nums[i])
class Solution {
public int maxSubArray(int[] nums) {
// 求最大的子序列和 求子序列 就会想到 动态规划
// 数组子序列
int max = nums[0];
int pre = 0 ;
for(int i = 0 ; i < nums.length;i++){
pre = Math.max(pre+nums[i],nums[i]);
max = Math.max(max,pre);
}
return max;
}
}
总结:一般来说:求数组子序列的或者相关的子序列问题,往往都能想到使用动态规划;
如果是字符串的子序列就会很容易牵扯到 KMP等问题
接下来我们可以想一下,这道题如果是求子序列的值呢?
public static int maxSubArray(int[] nums) {
// 求最大的子序列和 求子序列 就会想到 动态规划
// 数组子序列
//如果符合条件就加入 不符合就删除
List<Integer> list = new ArrayList<>();
int max = nums[0];
int pre = 0;
for (int i = 0; i < nums.length; i++) {
// pre = Math.max(pre + nums[i], nums[i]);
//将所有符合条件的值都加入列表
if (pre + nums[i] >= nums[i]) {
pre = pre + nums[i];
list.add(nums[i]);
} else {
pre = nums[i];
list.clear();
list.add(nums[i]);
}
max = Math.max(max, pre);
}
//在进行一个循环 把最大序列所有值找出来
int sum = 0;
List<Integer> result = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
sum += list.get(i);
result.add(list.get(i));
if (max == sum){
break;
}
}
//所求的最大子序列
System.out.println(result);
return max;
}