最大子序列和问题

//相比于其他三种算法,这种算法剔除了多余的循环部分,
//运行时间是明显缩减的,但其正确性却不是那么明显,
//需要正式的正确性证明。
#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;
}

给定一个整数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;
}
Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐