最大子序列和问题
//相比于其他三种算法,这种算法剔除了多余的循环部分,
//运行时间是明显缩减的,但其正确性却不是那么明显,
//需要正式的正确性证明。
#include <vector>
int maxSubSum(const std::vector<int> &a) {
int maxSum = 0;
int thisSum = 0;
for (int j = 0; j < a.size(); j++) {
//代码的精髓部分就在于此,若a[j]小于零,
//那它就无法作为子序列的起点,而一旦thisSum小于零,
//它自然也无法成为子序列的前缀子序列,遍历后我们不会
//漏掉最优解;
thisSum += a[j];
if (thisSum > maxSum) {
maxSum = thisSum;
}
else if (thisSum < 0) {
thisSum = 0;
}
}
return maxSum;
}
二分搜索(binary search)
给定一个整数X,和整数A0,A1,A2,…,An-1,后者已经预先排序并在内存中,求下标i是的X=Ai,如果X
不在序列中,返回i=-1.
#include <vector>
int binarySearch(const std::vector<int> &a, const int x) {
int low = 0;
int high = a.size()-1;
while (low < high) {
int mid = (low + high) / 2;
if (a[mid] < x) {
low = mid + 1;
}
else if (a[mid] > x) {
high = mid - 1;
}
else {
return mid;
}
}
return -1;
}
欧几里得算法
计算两个整数的最大公因数(The greatest common factor)
long gcd(long m, long n) {
while (n != 0) {
long rem = m%n; //若m<n,则第一次实现mn交换
m = n;
n = rem;
}
return m;
}