输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为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]); } } }