從N個數中取出三個數,求有多少種三個數的和是0,代碼以及算法分析

從N個數中取出三個數,求有多少種三個數的和是0?

很容易想到如下代碼

public static int count (int[]a){
    int count=0;
    int N=a.length;
    for(int i=0;i<N;i++){
        for(int j=i+1;j<N;j++){
            for(int k=j+1;k<N;k++){
                if(a[i]+a[j]+a[k]==0){
                    count++;
                }
            }
        }
    }
    return count;
}

 很容易想到從n個數中確三個數的組合共

n(n-1)(n-2)

但是其順序有A_{3}^{3} 種

所以其算法複雜度爲

n(n-1)(n-2)/A_{3}^{3} =N^{3}/6-N^{2}/2+N/3

這個表達式在N很大的時候首項相比其他項要大的多,比如N=1000時-N^{2}/2+N/3\approx 499667

N^{3}/6\approx 166 666 667 所以上式,可以簡化爲 N^{3}/6

典型的近似
函數 近似 增長的數量級
N^{3}/6-N^{2}/2+N/3 N^{3}/6 N^{3}
N^{2}/2-N/2 N^{2}/2 N^{2}
\lg N+1 \lg N \lg N
3 3 1

參考:

算法第四版 人民郵電出版社

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章