数据结构与算法分析(原书第3版)— 算法分析
1、最大子序列和问题求解
给定整数 A 1 , A 2 , A 3 , 。 。 。 , A N , A_1,A_2,A_3,。。。,A_N, A1,A2,A3,。。。,AN,求解 ∑ k = i j A k \sum_{k=i}^j A_k ∑k=ijAk的最大值。
例如:对于输入-2,11,4,13,-5,-2,答案为20(从 A 2 A_2 A2到 A 4 A_4 A4)
求解:
public static int maxSubSum(int[] a) {
int maxSum = 0, thisSum = 0;
for (int i = 0; i < a.length; i++) {
thisSum += a[i];
if (thisSum > maxSum) {
maxSum = thisSum;
} else if (thisSum < 0) {
thisSum = 0;
}
}
return maxSum;
}
2、折半查找
给定一个整数 X X X和整数 A 0 , A 1 , 。 。 。 , A N − 1 , A_0,A_1,。。。,A_{N-1}, A0,A1,。。。,AN−1,后者已经预先排序并在内存中 , , ,求下标 i i i使得 A i = X , A_i=X, Ai=X,如果 X X X不再数据中 , , ,则返回 i = − 1 。 i=-1。 i=−1。
求解:
private static final int NOT_FOUND = -1;
public static <AnyType extends Comparable<? super AnyType>>
int binarySearCh(AnyType[] a, AnyType x) {
int low = 0, high = a.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (a[mid].compareTo(x) < 0) {
low = mid + 1;
} else if (a[mid].compareTo(x) > 0) {
high = mid - 1;
} else {
return mid;
}
}
return NOT_FOUND;
}
3、欧几里得算法
计算最大公因数的欧几里得算法
public static long gcd(long m, long n) {
while (n != 0) {
long rem = m % n;
m = n;
n = rem;
}
return m;
}