突然萌生了一个想法 就是收集一些经典、优雅的算法
没事多翻翻看看 能够沉淀下来一些就好了

1、最大子序列的和

1
2
3
4
5
6
7
8
9
10
11
12
13
public static int maxSubsequenceSum(int[] a ,int N){
    int thisSum,MaxSum;
    thisSum = MaxSum = 0 ;
    for (int i = 0; i < N; i++) {
        thisSum += a[i];
        if(thisSum > MaxSum){
            MaxSum = thisSum;
        }else if(thisSum < 0){
            thisSum = 0 ;
        }
    }
    return MaxSum;
}

在数列不是全部为负数的前提下
算法很巧妙的用两个变量来储存 当前子列和 以及 最大子列和
并且及时地交换二者的值或者是 在当前子列和 小于0时 重置为 0
实现 一遍遍历就能得到最大子列和的目的 即 复杂度为O(n)

2、二分查找

1
2
3
4
5
6
7
8
9
10
11
12
public static int binarySearch(int key,int[] a){
    int lo = 0 ;
    int hi = a.length -1 ;
    while( lo <= hi){
         int mid = (lo + hi) / 2 ;
         if ( key < a[mid]) hi = mid - 1 ;
         else if( a[mid] < key) lo = mid + 1 ;
         else return mid ;
    }

    return -1 ;
}

是一个很经典的算法 前提是数列有序 复杂度为 O(lg n)

3、进制转换

1
2
3
4
5
6
7
8
char digits[] = {'0','1','2','3','4','5','6','7','8','9','A',
               'B','C','D','E','F'}; //全局变量
    void convert(int x,int y){
       if( x != 0) {
           convert(x /y , y);
            printf("%c",digits[x % y]);
     }
    }

一个精巧的进制转换代码,将十进制整数 x 转换为 y 进制 然后输出。
进制转换无非就是 除 然后 取余 ,但是有一个输出和处理过程是颠倒的问题。
精妙之处在于利用递归解决了输出需要逆置的问题,也可以用栈结构来解决。

待续…

Categories:

Updated: