lintcode(402)连续子数组求和

来源:互联网 发布:shift 在js中 编辑:程序博客网 时间:2024/05/29 05:06

描述:

给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大。输出答案时,请分别返回第一个数字和最后一个数字的下标。(如果两个相同的答案,请返回其中任意一个)

样例:

给定 [-3, 1, 3, -3, 4], 返回[1,4].

思路:

逐个累加求和,记录最小值和最大值的位置,最小值的下一位是丘壑最大值的起点,最大值[(sum- min)的最大值]的位置是和最大值的终点

public class Solution {    /**     * @param A an integer array     * @return  A list of integers includes the index of the first number and the index of the last number     */    public ArrayList<Integer> continuousSubarraySum(int[] A) {        // Write your code here        if(A==null||A.length==0) return null;          ArrayList<Integer> result = new ArrayList<Integer>();        result.add(-1);        result.add(-1);        int min = 0;        int max = Integer.MIN_VALUE;        int minpos = -1;        int sum = 0;                for(int i = 0;i<A.length;i++){            sum += A[i];            if(sum - min > max){                result.set(0 , minpos);                max = sum - min;                result.set(1 , i);            }                        if(sum < min){                min = sum;                minpos = i;            }        }        int temp = result.get(0);        result.set(0 , temp + 1);        return result;    }}


0 0