输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] array = new int[n];
for (int i = 0; i < n; i++) {
array[i] = in.nextInt();
}
int result = array[0];
int cur = array[0];
for (int i = 1; i < array.length; i++) {
cur = Math.max(cur + array[i], array[i]);
result = Math.max(cur, result);
}
System.out.println(result);
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a[] = new int [n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
int res=power(a);
System.out.print(res);
}
//动态规划,dp存的是当前长度数组连续子数组的最大和
static int power(int[] a){
int [] dp = new int[a.length];
dp[0]=a[0];
for(int i=1;i<a.length;i++){
dp[i] = Math.max(a[i],dp[i-1]+a[i]);
}
Arrays.sort(dp);
return dp[a.length-1];
}
} import java.util.Scanner;
/**
* @Author: coderjjp
* @Date: 2020-05-12 20:33
* @Description: 连续子数组最大和
* @version: 1.0
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int arr[] = new int[N];
for (int i = 0; i < N; i++)
arr[i] =sc.nextInt();
int cur = arr[0];
int ans = cur;
for (int i = 1; i < N; i++){
cur = Math.max(cur + arr[i], arr[i]);
ans = Math.max(ans, cur);
}
System.out.println(ans);
}
} import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for(int i = 0;i < n;i++){
sc.nextLine();
arr[i] = sc.nextInt();
}
System.out.println(maxSubArray(arr));
}
public static int maxSubArray(int[] nums) {
int n = nums.length;
int currSum = nums[0], maxSum = nums[0];
for(int i = 1; i < n; ++i) {
currSum = Math.max(nums[i], currSum + nums[i]);
maxSum = Math.max(maxSum, currSum);
}
return maxSum;
}
} import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] arr = new int[N];
for(int i=0;i<N;i++){
arr[i] = scanner.nextInt();
}
int[] sums = new int[N];
sums[0]=arr[0];
int max = 0;
int min = 0;
for(int i=1;i<N;i++){
sums[i] = sums[i-1]+arr[i];
max = sums[max]>sums[i]?max:i;
min = sums[min]<sums[i]?min:i;
}
if(max>min){
int ret = sums[max]>sums[max]-sums[min]?sums[max]:sums[max]-sums[min];
System.out.println(ret);
}else{
System.out.println(sums[max]);
}
}
}