LeetCode #373 Find K Pairs with Smallest Sums 查找和最小的K對(duì)數(shù)字

373 Find K Pairs with Smallest Sums 查找和最小的K對(duì)數(shù)字

Description:
You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k.

Define a pair (u,v) which consists of one element from the first array and one element from the second array.

Find the k pairs (u1,v1),(u2,v2) ...(uk,vk) with the smallest sums.

Example:

Example 1:

Input: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
Output: [[1,2],[1,4],[1,6]]
Explanation: The first 3 pairs are returned from the sequence:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

Example 2:

Input: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
Output: [1,1],[1,1]
Explanation: The first 2 pairs are returned from the sequence:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

Example 3:

Input: nums1 = [1,2], nums2 = [3], k = 3
Output: [1,3],[2,3]
Explanation: All possible pairs are returned from the sequence: [1,3],[2,3]

題目描述:
給定兩個(gè)以升序排列的整形數(shù)組 nums1 和 nums2, 以及一個(gè)整數(shù) k嘿棘。

定義一對(duì)值 (u,v)运嗜,其中第一個(gè)元素來(lái)自 nums1正罢,第二個(gè)元素來(lái)自 nums2。

找到和最小的 k 對(duì)數(shù)字 (u1,v1), (u2,v2) ... (uk,vk)讲坎。

示例 :

示例 1:

輸入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
輸出: [1,2],[1,4],[1,6]
解釋: 返回序列中的前 3 對(duì)數(shù):
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

示例 2:

輸入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
輸出: [1,1],[1,1]
解釋: 返回序列中的前 2 對(duì)數(shù):
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

示例 3:

輸入: nums1 = [1,2], nums2 = [3], k = 3
輸出: [1,3],[2,3]
解釋: 也可能序列中所有的數(shù)對(duì)都被返回:[1,3],[2,3]

思路:

求前 k個(gè)一般使用堆
使用小頂堆, 固定 nums1中的數(shù), 找到 nums2中的數(shù)加入結(jié)果中
時(shí)間復(fù)雜度O((k + n)lgn), 空間復(fù)雜度O(n)

代碼:
C++:

class Solution 
{
public:
    vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) 
    {
        vector<vector<int>> result;
        if (nums1.empty() or nums2.empty()) return result;
        int n = nums1.size(), m = nums2.size();
        k = min(n * m, k);
        priority_queue<pair<int, pair<int, int>>> heap;
        for (int i = 0; i < n; i++) heap.push({-nums1[i] - nums2[0], {i, 0}});
        while (result.size() < k) 
        {
            auto cur = heap.top();
            heap.pop();
            int i = cur.second.first, j = cur.second.second;
            result.push_back({nums1[i], nums2[j++]});
            if (j < m) heap.push({-nums1[i] - nums2[j], {i, j}});
        }
        return result;
    }
};

Java:

class Solution {
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        PriorityQueue<int[]> queue = new PriorityQueue<>((o1, o2) -> compare(o2, o1));
        for (int i : nums1) {
            if (queue.size() == k && compare(queue.peek(), new int[]{i, nums2[0]}) < 0) break;
            for (int j : nums2) {
                int[] arr = new int[]{i, j};
                if (queue.size() < k) queue.offer(arr);
                else if (!queue.isEmpty() && compare(queue.peek(), arr) > 0) {
                    queue.poll();
                    queue.offer(arr);
                } else break;
            }
        }
        List<List<Integer>> result = new ArrayList<>();
        while (!queue.isEmpty()) {
            int[] cur = queue.poll();
            result.add(0, Arrays.asList(cur[0], cur[1]));
        }
        return result;
    }
    
    private int compare(int[] arr1, int[] arr2) {
        return (arr1[0] + arr1[1]) - (arr2[0] + arr2[1]);
    }
}

Python:

class Solution:
    def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:
        return map(list, heapq.nsmallest(k, itertools.product(nums1, nums2), key=sum))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梳庆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泪蔫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喘批,死亡現(xiàn)場(chǎng)離奇詭異撩荣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)饶深,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門餐曹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人敌厘,你說(shuō)我怎么就攤上這事台猴。” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵饱狂,是天一觀的道長(zhǎng)曹步。 經(jīng)常有香客問我,道長(zhǎng)休讳,這世上最難降的妖魔是什么讲婚? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮俊柔,結(jié)果婚禮上筹麸,老公的妹妹穿的比我還像新娘。我一直安慰自己雏婶,他們只是感情好物赶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著留晚,像睡著了一般块差。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倔丈,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音状蜗,去河邊找鬼需五。 笑死,一個(gè)胖子當(dāng)著我的面吹牛轧坎,可吹牛的內(nèi)容都是我干的宏邮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼缸血,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜜氨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起捎泻,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤飒炎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后笆豁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郎汪,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年闯狱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了煞赢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哄孤,死狀恐怖照筑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤凝危,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布波俄,位于F島的核電站,受9級(jí)特大地震影響媒抠,放射性物質(zhì)發(fā)生泄漏弟断。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一趴生、第九天 我趴在偏房一處隱蔽的房頂上張望阀趴。 院中可真熱鬧,春花似錦苍匆、人聲如沸刘急。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叔汁。三九已至,卻和暖如春检碗,著一層夾襖步出監(jiān)牢的瞬間据块,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工折剃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留另假,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓怕犁,卻偏偏與公主長(zhǎng)得像边篮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奏甫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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