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
复杂度:
形成存储结构体的vector所需要的时间复杂度是O(n^2),sort的时间复杂度O(nlogn)。所以总的时间复杂度应该为O(n^2)。