LeetCode 第 290 场周赛题解及思路
6041. 多个数组求交集
给你一个二维整数数组
nums
,其中nums[i]
是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中的每个元素在nums
所有数组 中都出现过。
提示:
1 <= nums.length <= 1000
1 <= sum(nums[i].length) <= 1000
1 <= nums[i][j] <= 1000
nums[i]
中的所有值 互不相同
作为力扣竞赛的签到题,那必然是可以用 暴力 的方法写出来的。对于每个出现在任意 nums[i]
中的数 num
,我们去判断 num
是否出现在所有数组中,如果出现则将其压入结果数组 answer
,否则舍弃即可。最后使用 sort
对结果数组进行排序即可。这样的时间复杂度高达 O ( N 2 ) O(N^2) O(N2),虽然能过测试,但很憋屈。
于是考虑优化,看到提示中给出 nums[i]
中的所有值 互不相同,所以一个元素在所有数组中都出现过就等价于这个元素的出现总次数大于等于数组的个数。所有,我们用 unordered_map
统计元素在所有数组中的出现次数即可。
unordered_map<int, int> counts;
for (const vector<int>& num : nums)
for (const int& nn : num)
counts[nn]++;
然后将出现次数大于等于数组个数的元素放入结果数组 answer
并用 sort
排序。
vector<int> answer;
for (const auto& i