一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
[1]、哈希表
(假设数组A是元素多一点的数组,B数组是元素小一点)遍历两个数组中小的一个数组(也就是数组B),然后把数组B中每个数都存入哈希表中,然后再遍历数组A的每个元素,遍历的过程中每个元素都在要用依次哈希表,看哈希表是否有这个元素,如果有就证明有交集,就存储到要返回的目标数组里。
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size()) {
return intersect(nums2, nums1);
}//调用小的数组,节省哈希表所用空间
unordered_map <int, int>m;
vector<int> intersection;
for (int num : nums1) {
++m[num];
}//用num变量遍历nums1数组
for (int num : nums2) {
if (m.count(num)) {
//检索一下当前检索的这个数在哈希表中是否存在
intersection.push_back(num);
//如果没有就插入
--m[num];
if (m[num] == 0) {
//如果这个元素的在哈希表中的值变为0,就擦除这个元素,证明这个元素已经用过于取交集,否则的话count报错
m.erase(num);
}
}
}
return intersection;
}
[2]、可以用c++内置函数
求交集,这个一开始我没想到,也是看题解才知道
vector<int> intersect(vector<int>& nums1, vector<int>& nums2){
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
nums1.erase(set_intersection(begin(nums1),end(nums2)),
begin(nums1),end(nums1),begin(nums2),end(nums2));
return nums1;
}
[3]、排序+双指针
先对两个数组进行排序,然后用双指针,分别指向两个数组的头部,然后比较,指向较小的数的指针向右移动一位,如果相同就加入到结果数组中,然后同时向右移动一格。
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int length1 = nums1.size(), length2 = nums2.size();
int index1 = 0, index2 = 0;
vector<int> intersection;
while (index1 < length1 && index2 < length2) {
if (nums1[index1] < nums2[index2]) {
index1++;
}
else if (nums1[index1] > nums2[index2]) {
index2++;
}
else {
intersection.push_back(nums1[index1]);
index1++;
index2++;
}
}
return intersection;
}
[4]、暴力法
暴力法就是两个for去遍历,然后有相同元素就放入目标数组中,然后擦除erase,防止被重复计算
要注意erase的用法,这篇文章很详细,可以去看一下:
正确使用stl map的erase方法 - 小 楼 一 夜 听 春 雨 - 博客园 (cnblogs.com)
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> v;
int count = 0;
int num1Size = nums1.size();
int num2Size = nums2.size();
for (int i = 0; i < num1Size; i++) {
for (vector<int>::iterator it = nums2.begin(); it != nums2.end(); it++) {
if (nums1[i] == *it) {
int cur = nums1[i];
v.push_back(nums1[i]);
nums2.erase(it);//有相同元素就放入目标元素,并删掉这个元素在数组中
break;
}
}
}
return v;
}
};