Leetcode373: Find K Pairs with Smallest Sums

373. Find K Pairs with Smallest Sums

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 = 3

Return: [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 = 2

Return: [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,组成pair类型元素,其中每一个pair类型元素的first是在nums1中取值的,second在nums2中取值,按pair中元素和给pair排序,返回前K个和最小的pair。

解答:

这道题主要是对pair按照元素的和的大小来进行排序的,所以很自然地想到构造一个struct。

构造一个struct,含有变量a,用来记录其是由nums1中的什么元素构成;含有变量b,用来记录其是由nums2中什么元素构成;含有变量c,用来记录a+b的值。同时为了满足题目的要求按照pair的两元素和来排序,写一个函数bool operator < (Type & s)。

然后记录由nums1和nums2组成pair。这里是用刚刚定义的struct对其进行记录,记下a,b,c。形成的记录在vector<structType>中保存。

接下来对这个vector进行sort。排序之后,前K个struct就是满足要求的,这时候将其改写成pair类型就可以啦。

需要注意的是K和vector<structType>中所含有的元素数量的关系,因为可能vector中没有K个元素。同时,如果nums1或者nums2没有元素的话,就在函数的一开始进行判断。

代码:[cpp] view plain

  1. class Solution {  
  2. public:  
  3.     struct S{  
  4.         int a;  
  5.         int b;  
  6.         int c;  
  7.         bool operator < (S& ss){  
  8.             return c<ss.c;  
  9.         }    
  10.     };  
  11.   
  12.   
  13.     vector<pair<intint>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {  
  14.         vector<S> array;  
  15.         vector<pair<int,int> > res;  
  16.         S s;  
  17.         int len1=nums1.size();  
  18.         int len2=nums2.size();  
  19.         if(len1==0 || len2==0) return res;  
  20.         for(int i=0;i<len1;i++){  
  21.             for(int j=0;j<len2;j++){  
  22.                 s.a=nums1[i];  
  23.                 s.b=nums2[j];  
  24.                 s.c=s.a+s.b;  
  25.                 array.push_back(s);  
  26.             }  
  27.         }  
  28.         sort(array.begin(),array.end());  
  29.         pair<int,int> r;  
  30.         if(k>array.size()) k=array.size();  
  31.         for(int i=0;i<k;i++){  
  32.             r.first=array[i].a;  
  33.             r.second=array[i].b;  
  34.             res.push_back(r);  
  35.         }  
  36.         return res;  
  37.     }  
  38. };  

复杂度:

形成存储结构体的vector所需要的时间复杂度是O(n^2),sort的时间复杂度O(nlogn)。所以总的时间复杂度应该为O(n^2)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值