zl程序教程

您现在的位置是:首页 >  后端

当前栏目

连续子数组的最大和

数组 最大 连续
2023-06-13 09:14:14 时间

题目:

思路:

先是说一说对这道题的理解吧,这题要么采用的是暴力破解方法,采用双循环的方式。

通过一层循环,决定起始位置,然后不断循环从起始位置加起用于存储最大值。

或者采用动态规划,寻找出规律F(N) = F(N-1) + A[N]

这种方法的时间复杂度为O(N),空间复杂度为O(N)。

代码示例:

public class Solution {

    public static void main(String[] args) {

        int[] arr = {1, -2, 3, 10, -4, 7, 2, -5};

        int result = FindGreatestSumOfSubArray(arr);

        System.out.println(result);

    }

    public static int FindGreatestSumOfSubArray(int[] array) {

        int len = array.length;

        if (len == 0) {

            return 0;

        }

        //用于存储动态规划的结果数组

        int[] currentsum = new int[len];

        currentsum[0] = array[0];

        int maxsum = array[0];

        for (int i = 1; i < len; i++) {

            //利用F(N) = F(N-1) + A[N] 来记录以第i个数字结尾的子数组的最大和

            //此外要记得如果F(N)<0,则下一次会直接拿A[N]赋值进去,因为如果是负数了,那么与后面的数相加只会起到变小作用

            //此外,另用一个变量存储遇到的最大的连续子数组的和。

            if (currentsum[i - 1] > 0) {

                currentsum[i] = currentsum[i - 1] + array[i];

            } else {

                currentsum[i] = array[i];

            }

            if (currentsum[i] > maxsum) {

                maxsum = currentsum[i];

            }

        }

        return maxsum;

    }

}