面試題—三個數之和小於某個值的組合個數

本題是阿里螞蟻金服面試題:

給定一個數組s,和一個數a,在數組s裏面找到3個數使這3個數的和小於a,即s[i]+s[j]+s[k]<a,請你設計一個函數返回數組s裏這樣的組合有多少個?

   int f(double s[], double a) {
        int cnt = 0;
        Arrays.sort(s);
        int i = 0;
        int j = s.length;
        while (i < j - 1) {
            int low = i;
            int high = j;
            while (low < high) {
                int k = (low + high) / 2;

                if (s[i] + s[j] + s[k] >= a) {
                    high = k - 1;
                } else if (s[i] + s[j] + s[k] < a) {
                    // 下面區間都是滿足的
                    cnt += k - low;
                    // 二分查找
                    low = k + 1;
                }
            }

            // 掃描結束,根據情況移動上下限
            if (s[i] + s[j] > a) {
                j--;
            } else {
                i++;
            }
        }

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