最大连续子序列和,以及开始、结束下标(Java)

对一个有n个元素的数组,求最大的连续子数组的和,并求其开始、结束下标。
数组的元素必然有正数也有负数才有意义,如果全是正数,那最大的子数组就是本身;如果全部为负数,那最大子数组就是空数组。
例如下面的数组,其最大子数组序列和为187,子数组为X[2,..,6]:

31-415926-535897-93-2384

先给定一个temp,让它从头开始加每个数字,temp小于0时,我们重新开始计算,另temp = 0,让开始的下标从这个位置开始。再记一个max,是我们用来存结果的,如果temp大于max,则让max = temp,让end下标移到这个位置.

public void maxSum(int[] nums) {
        int start = 0;
        int end = 0;
        int max = 0;

        int temp = 0;
        int ts = 0;
        for(int i = 0; i < nums.length; i++) {
            temp += nums[i];
            if(temp < 0) {
                ts = i + 1;
                temp = 0;
            } else {
                if(temp > max) {
                    start = ts;
                    end = i;
                    max = temp;
                }
            }
        }

        System.out.println("maxSum = " + max + ", start : " + start + ", end = " + end);
    }

时间复杂度O(N)

点赞