您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# C++如何解决两个数组的交集问题
## 引言
在编程面试和算法练习中,求解两个数组的交集是一个经典问题。本文将深入探讨如何使用C++高效解决这个问题,分析不同方法的优缺点,并提供详细的代码实现和性能比较。
## 问题定义
给定两个整数数组`nums1`和`nums2`,返回它们的交集。结果中的每个元素必须是唯一的(即去重后的结果),且不考虑输出顺序。
**示例1**:
```cpp
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
#include <vector>
#include <unordered_set>
using namespace std;
vector<int> intersection_brute(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result;
for (int num1 : nums1) {
for (int num2 : nums2) {
if (num1 == num2) {
result.insert(num1);
break;
}
}
}
return vector<int>(result.begin(), result.end());
}
vector<int> intersection_hash(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> set1(nums1.begin(), nums1.end());
unordered_set<int> result;
for (int num : nums2) {
if (set1.count(num)) {
result.insert(num);
}
}
return vector<int>(result.begin(), result.end());
}
vector<int> intersection_two_pointers(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int> result;
int i = 0, j = 0;
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] == nums2[j]) {
// 避免重复添加
if (result.empty() || nums1[i] != result.back()) {
result.push_back(nums1[i]);
}
i++;
j++;
} else if (nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
return result;
}
bool binarySearch(const vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) return true;
if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return false;
}
vector<int> intersection_binary(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
unordered_set<int> result;
for (int num : nums2) {
if (binarySearch(nums1, num)) {
result.insert(num);
}
}
return vector<int>(result.begin(), result.end());
}
方法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
暴力搜索法 | O(m*n) | O(min(m,n)) | 小规模数据 |
哈希集合法 | O(m+n) | O(m+n) | 通用场景 |
排序+双指针法 | O(mlogm + nlogn) | O(1) | 内存受限或已排序数据 |
二分查找法 | O((m+n)logm) | O(min(m,n)) | 一个数组远大于另一个 |
如果需要保留交集元素的出现次数(如交集中出现次数较少的那个),可以使用哈希表记录出现次数:
vector<int> intersection_with_count(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> count_map;
vector<int> result;
for (int num : nums1) count_map[num]++;
for (int num : nums2) {
if (count_map[num]-- > 0) {
result.push_back(num);
}
}
return result;
}
当数组太大无法一次性加载到内存时: 1. 使用外部排序算法先排序 2. 分块加载数据并应用双指针法 3. 合并部分结果
if (nums1.empty() || nums2.empty()) return {};
忘记去重:使用集合或排序后跳过重复元素
指针越界:双指针法中确保指针不越界
while (i < nums1.size() && j < nums2.size())
在C++中解决数组交集问题有多种方法,选择取决于具体场景: - 小数据量:简单暴力法即可 - 中等数据量:哈希集合法最优 - 大数据量或内存敏感:排序+双指针法 - 一个数组远大于另一个:二分查找法
理解这些算法的原理和适用场景,能够帮助我们在实际编程中做出最优选择。
”`
注:本文实际约2100字,包含了多种解决方案的详细实现、复杂度分析和实际应用建议,符合Markdown格式要求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。