输入一个整型数组,数组中的一个或者连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组[4,-1,2,1] 的和最大,为6。
提示:
1<=nums.length<=10^5;
-100<=nums[i]<=100。
首先:求最值问题的,不是贪心策略(算法)就是动态规划
采取贪心策略,只要当前子段的和最大,就记录到maxSum中,如果sum的结果小于0,必须将sum重新置为0,即sum=0,然后重新开始计算新的子段和,因为加上负数只会更小。
nums = [-2,1,-3,4,-1,2,1,-5,4]
例如:初始化 sum=0; maxSum = nums[0]; 从第一个开始遍历。
sum = sum+nums[i] 第一个是-2,则sum=-2=maxSum。
此时sum=-2,小于0,下一个数加上-2怎么也比原本的小,所以将sum置为0。
public static void main(String[] args){ Scanner sc= new Scanner(System.in); String strNums = sc.nextLine(); String[] strNumArray = strNums.split(" "); int [] nums = new int[strNumArray.length]; for(int i=0;i<strNumArray.length;i++){ nums[i] = Integer.valueOf(strNumArray[i]); } int sum = 0;//将子数组和初始化为0 //用来记录子数组最大的和,先初始化为第一个数组的值 int maxSum = nums[0]; for(int i= 0;i<nums.length;i++){ //循环遍历数组中的每一个数 sum = sum + nums[i]; //如果子数组和大于最大和,则将子数组和赋值给最大和 if(sum>=maxSum) maxSum = sum; //如果子数组和小于0,则置为0;因为任何数加一个负数,都比其本身小 if(sum<0) sum = 0; } System.out.println(maxSum); }