一、前言
本文介绍了有关数组的算法第四部分的 Java 代码实现,算法实例:
- 求数组当中的最长递增子序列(求数组当中的最长递减子序列)
- 区间重合判断
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
二、代码
1. 求数组当中的最长递增子序列
实现代码
class Untitled {
//查找最长递增子序列。
static void searchMaxIncSubArray(int p[], int length) {
//maxValue[i]表示长度为i的递增子序列的最大元素的最小值。
int[] maxValue = new int[length+1];
maxValue[1] = p[0];
int k=1;
for (int i=1; i<length; i++) {
if (p[i] > maxValue[k]) {
k++;
maxValue[k] = p[i];
} else if (p[i] == maxValue[k]) {
//如果p[i]和maxValue[k],那么越过。
continue;
} else {
//如果p[i]小于maxValue[k]。
if (p[i] < maxValue[1]) {
maxValue[1] = p[i];
continue;
}
int first = 1;
int last = k;
//二分查找:目的是在maxValue数组中找到大于p[i]的第一个元素,如果它大于p[i],那么就替换它。
while (first < last) {
int mid = (last-first) >> 1;
if (maxValue[first+mid] < p[i]) {
first=first+mid+1;
} else if (maxValue[first+mid] > p[i]) {
last=first+mid;
} else {
first=first+mid+1;
}
}
//进行替换。
if (p[i] < maxValue[first]) {
p[i] = maxValue[first];
}
}
}
System.out.println("k="