[关闭]
@XQF 2017-08-26T17:07:20.000000Z 字数 1259 阅读 915

如何求最大子数组之和?(连续的子数组)

数据结构与算法


1.首发--简单动态规划

动态规划分两种,一种是人人为我,一种是我为人人。分析的关键就是最优子问题。这个最优可以有上一步的最优得到。

假设a数组长度为n。针对数组的最后一个元素有两种情况。

  1. 一种是最大子数组包含最后一个元素
  2. 一种是不包含。

这个不包含的话就好理解了,就要求的是[0,n-2]范围内的最大子数组。

要是包含的话又有两种情况:

  1. a[n-1]单独成为最大子数组
  2. a[n-1]非单独

非单独的情况就是以a[n-1]结尾的情况。end[n-1]

综上:数组a的最大子数组求解公式可以归纳为


  1. public class Solution {
  2. public int maxSubArray(int[] nums) {
  3. int len = nums.length;
  4. int[] end = new int[len];
  5. int[] all = new int[len];
  6. //dp数组第一项和最后一项一定要给定,因为涉及到当前点,也就是最后结束的临界条件
  7. end[0] = all[0] = nums[0];
  8. end[len - 1] = all[len - 1] = nums[len - 1];
  9. for (int i = 1; i < len; i++) {
  10. //end数组表示的最大子数组和是一定包含最后一项的
  11. end[i] = Math.max(end[i - 1] + nums[i], nums[i]);
  12. //把包含最后一项和不包含最后一项的情况比划
  13. all[i] = Math.max(end[i], all[i - 1]);
  14. }
  15. return all[len - 1];
  16. }
  17. public static void main(String[] args) {
  18. Solution solution = new Solution();
  19. int[] nums = {1, -2, 4, 8, -4, 7, -1, -5};
  20. System.out.println(solution.maxSubArray(nums));
  21. }
  22. }

2.重构

  1. public class Solution {
  2. public int maxSubArray(int[] nums) {
  3. int end = nums[0];
  4. int all = nums[0];
  5. for (int i = 1; i < nums.length; i++) {
  6. end = Math.max(end + nums[i], nums[i]);
  7. all = Math.max(end, all);
  8. }
  9. return all;
  10. }
  11. public static void main(String[] args) {
  12. Solution solution = new Solution();
  13. int[] nums = {1, -2, 4, 8, -4, 7, -1, -5};
  14. System.out.println(solution.maxSubArray(nums));
  15. }
  16. }

首发应该是叫做记忆DP。主要是状态的保存

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注