import java.util.Scanner;
import static java.lang.Math.*;
public class Main {
/**
* O(n) algorithm.
*/
public static int longestSubsequence1(int[] p, int n) {
int thisSum = 0;
int maxSum = 0;
for (int i = 0; i < n; i++) {
thisSum += p[i];
if (thisSum > maxSum) {
maxSum = thisSum;
}
if (thisSum < 0)
thisSum = 0;
}
return maxSum;
}
/**
* O(n*log(n)) algorithm
*/
public static int longestSubsequence2(int[] p, int l, int r) {
if(l == r)
return p[l];
if(l < r) {
int mid = (l + r) / 2;
int leftSum = longestSubsequence2(p, l, mid-1);
int rightSum = longestSubsequence2(p, mid + 1, r);
int maxLeft, maxRight;
int thisLeft, thisRight;
thisLeft = thisRight = maxLeft = maxRight = 0;
for (int i = mid-1; i >= l; i--) {
thisLeft += p[i];
maxLeft = max(maxLeft, thisLeft);
}
for (int i = mid; i <= r; i++) {
thisRight += p[i];
maxRight = max(maxRight, thisRight);
}
int maxSum = maxLeft+maxRight;
maxSum = max(maxSum, max(leftSum, rightSum));
return maxSum ;
}
return 0;
}
public static void main(String[] args) {
int k;
int[] p;
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
k = scanner.nextInt();
p = new int[k];
for (int i = 0; i < k; i++) {
p[i] = scanner.nextInt();
}
//System.out.println(longestSubsequence1(p, k));
System.out.println(longestSubsequence2(p, 0, k-1));
}
}
01-复杂度1 最大子列和问题(20 分)
最新推荐文章于 2025-04-26 22:36:52 发布
本文介绍两种不同的算法实现方式来寻找整数数组中的最大子序列和:一种为线性时间复杂度O(n),另一种为对数线性时间复杂度O(n*log(n))。通过递归分解问题,第二种算法适用于大数据集,而第一种算法则更简单且效率高。
2089

被折叠的 条评论
为什么被折叠?



