最长子序列和(由浅入深)
O(N^2)
package heng.java.level1;
import java.util.Scanner;
public class TheMostLongSequenceSum4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int m = input.nextInt();
while(m-->0){
int n = input.nextInt();
int [] arr = new int [n];
for (int i = 0; i < n; i++) {
arr[i] = input.nextInt();
}
int max = maxSubSum(arr);
System.out.println(max);
}
}
public static int maxSubSum(int []arr){
int maxSum = 0;
for (int i = 0; i < arr.length; i++) {
int thisSum = 0;
for (int j = i; j < arr.length; j++) {
thisSum += arr[i];
if(thisSum > maxSum){
maxSum = thisSum;
}
}
}
return maxSum;
}
}
O(1)
package heng.java.level1;
import java.util.Scanner;
public class TheMostLongSequenceSum3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int m = input.nextInt();
while(m-->0){
int n = input.nextInt();
int [] arr = new int [n];
for (int i = 0; i < n; i++) {
arr[i] = input.nextInt();
}
int max = maxSubSum(arr);
System.out.println(max);
}
}
public static int maxSubSum(int []arr){
int maxSum = 0, thisSum = 0;
for(int j=0; j<arr.length; j++){
thisSum += arr[j];
if(thisSum > maxSum){
maxSum = thisSum;
}else if(thisSum < 0){
thisSum = 0;
}
}
return maxSum;
}
}
O(N)
递归&&分治法:
package heng.java.level1;
import java.util.Scanner;
public class TheMostLongSequenceSum2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int m = input.nextInt();
while(m-->0){
int n = input.nextInt();
int [] arr = new int [n];
for (int i = 0; i < n; i++) {
arr[i] = input.nextInt();
}
int max = maxSumRec(arr,0,arr.length-1);
System.out.println(max);
}
}
public static int maxSumRec(int []arr, int left, int right){
if(left == right){
if(arr[left] > 0){
return arr[left];
}else{
return 0;
}
}
int center = (left+right)/2;
int maxLeftSum = maxSumRec(arr,left,center);
int maxRightSum = maxSumRec(arr,center+1,right);
int maxLeftBorderSum=0,leftBorderSum=0;
for(int i=center; i>=left; i--){
leftBorderSum += arr[i];
if(leftBorderSum > maxLeftBorderSum){
maxLeftBorderSum = leftBorderSum;
}
}
int maxRightBorderSum=0,rightBorderSum=0;
for(int i=center+1; i<=right; i++){
rightBorderSum += arr[i];
if(rightBorderSum > maxRightBorderSum){
maxRightBorderSum = rightBorderSum;
}
}
int sum = maxRightBorderSum+maxLeftBorderSum;
if(sum < maxLeftSum) sum = maxLeftSum;
if(sum < maxRightSum) sum = maxRightSum;
return sum;
}
}
浙公网安备 33010602011771号