当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

输入一个非空整型数组,数组里的数可能为正,也可能为负。
数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)

解法

动态规划法。

res[i] 表示以第 i 个数字结尾的子数组的最大和,那么求出 max(res[i]) 即可。

  • res[i] = array[i], if res[i - 1] < 0
  • res[i] = res[i - 1] + array[i], if res[i - 1] >= 0
  1. /**
  2. * @author bingo
  3. * @since 2018/12/7
  4. */
  5. public class Solution {
  6. /**
  7. * 求连续子数组的最大和
  8. *
  9. * @param array 数组
  10. * @return 最大和
  11. */
  12. public int FindGreatestSumOfSubArray(int[] array) {
  13. int n = array.length;
  14. int[] res = new int[n];
  15. res[0] = array[0];
  16. int max = res[0];
  17. for (int i = 1; i < n; ++i) {
  18. res[i] = res[i - 1] > 0 ? res[i - 1] + array[i] : array[i];
  19. max = Math.max(max, res[i]);
  20. }
  21. return max;
  22. }
  23. }

测试用例

  1. 功能测试(输入的数组中有正数也有负数;输入的数组中全是正数;输入的数组中全是负数);
  2. 特殊输入测试(表示数组的指针位为空指针)。

该分类下的相关小册推荐: