题目链接:
题目:
Given two arrays, write a function to compute their intersection.
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2]
Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] Output: [9,4]
Note:
- Each element in the result must be unique.
- The result can be in any order.
题目分析:
给两个数组,要求我们求出两个数组的交集。注意点:交集元素不能重复,交集的顺序可以任意。
预备知识:
这里要使用到vector,所以具体可以参考我的另一篇博客:C++的vector用法
解题思路:
先将两个数组排序,直接利用sort进行升序排序即可。然后给两个指针i ,j 分别指向两个数组,因为都是升序排序,所以此时可以直接比较 nums1[i] 和 nums2[j]。三种情况:
如果是 nums1[i] < nums2[j] ,那么说明 nums1[i] 的数太小,因此 ++i ;
如果是nums1[i] > nums2[j] ,那么说明 nums2[j] 的数太小,因此 ++j ;
如果是 nums1[i] == nums2[j] ,那么此时这个就是相等的,也就是交集,但是有一个问题,就是这个相等的值,是不是已经保存过了,如果保存过了,那么这个值不能保存,因此要求交集中的元素是不能重复的。
那么解决方法,我考虑了两种:
第一种:就是在选择 i ,j 指向的两个数组,如果有重复部分,应该指向最后一个来进行比较 nums1[i] 和 nums2[j]。比如 1 1 2 2 和2 2,那么第一次判断的时候,本来 i=0, 但是因为 i=0 和 i=1相等,所以处理一下,应该用 i=1 的对应值来进行比较。
第二种:在 nums1[i] == nums2[j] 成立时,考虑存进去的交集数组,如果是空的那么存,如果不是空的且交集数组最后一位和nums1[i] 不相等,则可以存;如果是相等的,说明存进去会重复,所以不能存。
AC代码:
第一种:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int len1 = nums1.size();
int len2 = nums2.size();
int i = 0, j = 0;
while(i<len1 && j<len2){
while(i<len1-1 && nums1[i]==nums1[i+1]){ // 要i的范围条件在前面,因为如果nums1[i]==nums1[i+1]条件放在前面的话,会导致数组溢出
i++;
}
while(j<len2-1 && nums2[j]==nums2[j+1]){
j++;
}
if(nums1[i] < nums2[j])
i++;
else if((nums1[i] > nums2[j]))
j++;
else if(nums1[i] == nums2[j]){
res.push_back(nums1[i]);
i++;
j++;
}
}
return res;
}
};
第二种:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
int i = 0, j = 0;
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] < nums2[j]) ++i;
else if (nums1[i] > nums2[j]) ++j;
else {
if (res.empty() || res.back() != nums1[i]) {
res.push_back(nums1[i]);
}
++i; ++j;
}
}
return res;
}
};