[LeetCode] 373. Find K Pairs with Smallest Sums

来源:互联网 发布:安卓扒谱软件 编辑:程序博客网 时间:2024/06/06 00:41

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 1:

Given nums1 = [1,7,11], nums2 = [2,4,6],  k = 3Return: [1,2],[1,4],[1,6]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:

Given nums1 = [1,1,2], nums2 = [1,2,3],  k = 2Return: [1,1],[1,1]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:

Given nums1 = [1,2], nums2 = [3],  k = 3 Return: [1,3],[2,3]All possible pairs are returned from the sequence:[1,3],[2,3]
// 直接上最小堆,但是nums1、nums2已排序的信息没有利用上。class Solution {public:    vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {        auto cmp = [](pair<int, int>& p1, pair<int, int>& p2)                    { return p1.first + p1.second > p2.first + p2.second; };        priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq(cmp);        for (auto num1 : nums1) {            for (auto num2 : nums2) {                pq.push(make_pair(num1, num2));            }        }        vector<pair<int, int>> res;        while (k-- && !pq.empty()) {            res.push_back(pq.top());            pq.pop();        }        return res;    }};

这里写图片描述这里写图片描述

class Solution {public:    vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {        if (k == 0 || nums1.size() == 0 || nums2.size() == 0) return {};        auto cmp = [nums1, nums2](pair<int, int>& p1, pair<int, int>& p2) {                      return nums1[p1.first] + nums2[p1.second] >                              nums1[p2.first] + nums2[p2.second]; };        priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq(cmp);        for (int i = 0; i < nums1.size() && i < k; i++)            pq.emplace(i, 0);        vector<pair<int, int>> res;        while (!pq.empty() && k--) {            auto pair = pq.top();            pq.pop();            if (pair.second + 1 < nums2.size())                pq.emplace(pair.first, pair.second + 1);            res.emplace_back(nums1[pair.first], nums2[pair.second]);        }        return res;    }};

这里写图片描述这里写图片描述

class Solution {public:    vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {        if (k == 0 || nums1.size() == 0 || nums2.size() == 0) return {};        vector<int> partnerid(min(k, (int)nums1.size()), 0);        vector<pair<int, int>> res;        int sz = min(k, (int)(nums1.size() * nums2.size()));        while (sz--) {            int minsum = INT_MAX, minidx = 0;            for (int i = 0; i < partnerid.size(); i++) {                if (partnerid[i] < nums2.size()) {                    int tmpsum = nums1[i] + nums2[partnerid[i]];                    if (tmpsum < minsum) {                        minsum = tmpsum;                        minidx = i;                    }                }            }            res.emplace_back(nums1[minidx], nums2[partnerid[minidx]]);            partnerid[minidx]++;        }        return res;    }};

这里写图片描述这里写图片描述

阅读全文
0 0
原创粉丝点击