465. 兩個(gè)排序數(shù)組和的第K小

描述

給定兩個(gè)排好序的數(shù)組 A, B险绘,定義集合 sum = a + b 商模,求 sum 中第k小的元素

樣例

給出 A = [1,7,11] B = [2,4,6]
當(dāng) k = 3, 返回 7.
當(dāng) k = 4, 返回 9.
當(dāng) k = 8, 返回 15.

挑戰(zhàn)

Do it in either of the following time complexity:

  1. O(k log min(n, m, k)). where n is the size of A, and m is the size of B.
  2. O( (m + n) log maxValue). where maxValue is the max number in A and B.

思路

排序矩陣中的從小到大第k個(gè)數(shù)這題的馬甲變換

代碼

  1. 兩個(gè)排序數(shù)組分別作為行列,對(duì)應(yīng)每個(gè)位置的和組成的矩陣其實(shí)是按照行從小到大列從小到大的順序排列的
class Pair {
    public int x, y, sum;
    public Pair(int x, int y, int val) {
        this.x = x;
        this.y = y;
        this.sum = val;
    }
}
class PairComparator implements Comparator<Pair> {
    public int compare(Pair a, Pair b) {
        return a.sum - b.sum;
    }
}

public class Solution {
    /**
     * @param A an integer arrays sorted in ascending order
     * @param B an integer arrays sorted in ascending order
     * @param k an integer
     * @return an integer
     */
    public int kthSmallestSum(int[] A, int[] B, int k) {
        int[] dx = new int[]{0, 1};
        int[] dy = new int[]{1, 0};
        boolean[][] hash = new boolean[A.length][B.length];
        PriorityQueue<Pair> minHeap = new PriorityQueue<Pair>(k, new PairComparator());
        minHeap.add(new Pair(0, 0, A[0] + B[0]));

        for(int i = 0; i < k - 1; i ++){
            Pair cur = minHeap.poll();
            for(int j = 0; j < 2; j ++){
                int next_x = cur.x + dx[j];
                int next_y = cur.y + dy[j];
                Pair next_Pair = new Pair(next_x, next_y, 0);
                if(next_x < A.length && next_y < B.length &&  !hash[next_x][next_y]){
                    hash[next_x][next_y] = true;
                    next_Pair.sum = A[next_x] + B[next_y];
                    minHeap.add(next_Pair);
                }
            }
        }
        return minHeap.peek().sum;
    }
}
  1. 二分法(看不太懂)
    復(fù)雜度: O((m + n) * lg (MAX_SUM - MIN_SUM))
    思路:二分法相當(dāng)于元素到其排序的映射厦幅,這里的元素是兩個(gè)數(shù)組任意兩個(gè)元素的和
class Range {
    int lt = 0;
    int le = 0;
}
    

    Range search (int[] A, int[] B, int v) {
        int i = A.length - 1;
        int j = 0;
        Range ans = new Range();
        
        //  find number elements that are smaller than v
        while (i >= 0 && j < B.length) {
            int sum = A[i] + B[j];
            if (sum < v) {
                j ++;
                ans.lt += i + 1;
            } else {
                i--;
            }
        }
        
        i = A.length - 1;
        j = 0;
        
        //  find number of elements that are less than or equal to v
        while (i >= 0 && j < B.length) {
            int sum = A[i] + B[j];
            if (sum <= v) {
                j ++;
                ans.le += i + 1;
            } else {
                i --;
            }
        }
        return ans;
    }


    public int kthSmallestSum (int[] A, int[] B, int k) {
        
        int min = A[0] + B[0];
        Range ret = search(A, B, min);
        if (ret.le >= k) return min;
        
        int max = A[A.length - 1] + B[B.length - 1];
        ret = search(A, B, max);
        if (ret.lt < k) return max;
        
        while (min < max - 1) {  // invariant: min < X < max.
            
            int mid = min + (max - min) / 2;
            ret = search(A, B, mid);
            
            if (ret.lt < k && ret.le >= k) return mid;
            if (ret.le < k) min = mid;
            if (ret.le >= k) max = mid;
        }
        
        throw new IllegalArgumentException("k = " + k);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沾鳄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子确憨,更是在濱河造成了極大的恐慌译荞,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件休弃,死亡現(xiàn)場(chǎng)離奇詭異吞歼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)塔猾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)篙骡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事糯俗∧蛲剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵得湘,是天一觀的道長(zhǎng)杖玲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)淘正,這世上最難降的妖魔是什么摆马? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鸿吆,結(jié)果婚禮上囤采,老公的妹妹穿的比我還像新娘。我一直安慰自己伞剑,他們只是感情好斑唬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布市埋。 她就那樣靜靜地躺著黎泣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缤谎。 梳的紋絲不亂的頭發(fā)上抒倚,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音坷澡,去河邊找鬼托呕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛频敛,可吹牛的內(nèi)容都是我干的项郊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼斟赚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼着降!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拗军,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤任洞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后发侵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體交掏,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年刃鳄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盅弛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熊尉,靈堂內(nèi)的尸體忽然破棺而出罐柳,到底是詐尸還是另有隱情,我是刑警寧澤狰住,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布张吉,位于F島的核電站,受9級(jí)特大地震影響催植,放射性物質(zhì)發(fā)生泄漏肮蛹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一创南、第九天 我趴在偏房一處隱蔽的房頂上張望伦忠。 院中可真熱鬧,春花似錦稿辙、人聲如沸昆码。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赋咽。三九已至,卻和暖如春吨娜,著一層夾襖步出監(jiān)牢的瞬間脓匿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工宦赠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陪毡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓勾扭,卻偏偏與公主長(zhǎng)得像毡琉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妙色,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容