问题:给定数组 a[1,2..n] ,求最大子数组和,即找出 1≤i≤j≤n 使得 a[i]+a[i]+..+a[j] 值最大。
有三种方法可以解决上述问题:
第一种 :暴力枚举法,其时间复杂度为 O(n3)
第二种 :优化枚举法,其时间复杂度为 O(n2)
第三种 :贪心方法,其时间复杂度为 O(n)
以上三种方法,暴力枚举是一种万能的算法,但不是对于任何问题都适用,优化枚举是一种较为优化的算法,贪心算法则是本题的最优解。如果一个问题,你给出的算法时间复杂度为 O(n3) , O(n2) , O(2n) , O(n!) 我们需要注意两点.
1. 明确数据量的大小.
2. 可能会有更优化的方法.
谈算法不谈时间复杂度等于耍流氓,本题是一道经典的算法题,前两种方法比较好理解。下面我们给出详细思路:
方法一:
暴力枚举法:
包括三层循环,首先定义一个数组nums,第一层循环从数组头0 遍历每个位置 start 作为子数组起始索引,第二层循环,从 start 处遍历 大于等于 start 的位置