首页 > 试题广场 >

(编程题)输入一个整型数组,子数组为这个数组中连续的一个或者

[问答题]
(编程题)输入一个整型数组,子数组为这个数组中连续的一个或者多个整数组成的数组。求所有子数组中的和的最大值。要求时间复杂度为O(n)。例如,输入数组为[1, -3, 9, 10, -2, 3, -6, 5]。和最大的子数组为 [9, 10, -2, 3],因此输出为该子数组的和20。

剑指Offer-连续子数组的最大和

public class Solution01 {
    public static void main(String[] args) {
        int[] arr = {1, -3, 9, 10, -2, 3, -6, 5};
        System.out.println(FindGreatestSumOfSubArray(arr));
    }
    public static int FindGreatestSumOfSubArray(int[] array) {
        if(array.length==0)
            return 0;
        int sum = array[0];//保存每组的和
        int maxSum = array[0];//连续子数组最大和
        //动态规划
        for(int i = 1;i<array.length;i++){
            sum = Math.max(sum+array[i],array[i]);
            maxSum = Math.max(sum,maxSum);
        }
        return maxSum;
    }
}
发表于 2018-04-14 15:19:58 回复(0)
def maximunSubarray(list):
    sum, result = 0, min(list)-1
    for i in range(0, len(list)):
        sum += list[i]
        if sum>result:
            result = sum
        if sum<0:
            sum = 0
    return result

print(maximunSubarray([1, -3, 9, 10, -2, 3, -6, 5]))


发表于 2018-04-11 17:27:52 回复(0)
int k=num.size();
 vector<int> dp(numsSize);
int dp[0]=num[0];
int RES=num[0];
if(k<=0) return num[0];
for(int i=1;i<k;i++){
 dp[i]=max{dp[i-1]+num[i],num[i]}
 RES=max{dp[i],RES}
}
发表于 2021-03-11 11:07:17 回复(0)
while 1:
    l=map(int,raw_input().split())
    sum=l[0]
    res=[] for i in range(1,len(l)): if sum>0:
            sum+=l[i] else:
            sum=l[i]
        res.append(sum)
    res=sorted(res) print res[-1] break

发表于 2018-07-04 14:47:31 回复(0)
public class Soulution {
    public static int getMax(int[] nums) {
        int ans = nums[0];
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            ans = Math.max(ans, sum);
            if (sum < 0) {
                sum = 0;
            }
        }
        return ans;
    }
发表于 2018-04-14 17:00:07 回复(0)
import java.util.Arrays; import java.util.Scanner; public class text2 { public static void main(String[] args) { Scanner aScanner=new Scanner(System.in); ArrayList<Integer> arrayList=new ArrayList<Integer>(); for(int i=0;i<8;i++) arrayList.add(aScanner.nextInt()); int bigsum=0; for(int i=0;i<arrayList.size();i++) { if(arrayList.get(i)>0) { int  sum=0; for(int j=i;j<arrayList.size();j++) { sum=sum+arrayList.get(j); if(sum<0) break; else  { if(bigsum<=sum) bigsum=sum; } } }  System.out.println(bigsum); } }

import java.util.Arrays;
import java.util.Scanner;
public class text2 {
public static void main(String[] args) {
Scanner aScanner=new Scanner(System.in);
ArrayList<Integer> arrayList=new ArrayList<Integer>();
for(int i=0;i<8;i++)
arrayList.add(aScanner.nextInt());
int bigsum=0;

for(int i=0;i<arrayList.size();i++)
{
if(arrayList.get(i)>0)
{
int  sum=0;
for(int j=i;j<arrayList.size();j++)
{
sum=sum+arrayList.get(j);
if(sum<0)
break;
else 
{
if(bigsum<=sum)
bigsum=sum;
}
}
}

System.out.println(bigsum);
}
}

编辑于 2018-03-28 22:11:12 回复(0)
/**
 * 求一个数组中最大和的连续子数组
 */
var arr = [1,2,3,4,-2,-5,0,15,-4,-10,200,17,-20,-21];
var sum = 0,
    max = 0;
for(var i = 0; i < arr.length; i++){
    if(arr[i] >= 0){
        //当前元素为正数,如果之前的和小于0,就重新开始子数组统计,否则纳入到该子数组中
        sum = sum < 0 ? arr[i] : sum + arr[i];
        //更新最大和
        max = Math.max(max,sum);
    }else{
        //负数情况直接在总和里扣除
        sum += arr[i];
    }
}
console.log(max);
编辑于 2018-03-24 10:39:26 回复(1)
 
发表于 2018-03-23 09:44:09 回复(0)