LeetCode Daily 11
2022-1-14 T.373 查找和最小的K对数字
c++11 的新特性-----Tuple
题目描述:
给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。
请找到和最小的 k 个数对 (u1,v1), (u2,v2) ... (uk,vk) 。
示例:
输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3 输出: [1,2],[1,4],[1,6] 解释: 返回序列中的前 3 对数: [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
思路:
Tuple 是固定大小不同值的集合,是pair的泛化、升级版。保存三个及以上的数据使用。
用一个set存储 tuple:nums1和nums2的和,nums1的下标,nums2的下标。
逐个更新set中的值,利用set自动排序的特性,每次选出和最小的值,通过下标加入res中。
代码:
class Solution { public: vectorint>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) { set int, int, int>> s; s.insert({nums1[0] + nums2[0], 0, 0}); vector int>> res; while(res.size() < k && s.size()) { auto x = *s.begin(); int a = get<1>(x), b = get<2>(x); //tuple的get方法:get<位置下标>(数值对象) s.erase(s.begin()); res.push_back({nums1[a], nums2[b]}); if(a + 1 < nums1.size()) { s.insert({nums1[a + 1] + nums2[b], a + 1, b}); } if(b + 1 < nums2.size()) { s.insert({nums1[a] + nums2[b + 1], a, b + 1}); } } return res; } };