1 问题描述
547 两数组的交
返回两数组的交
样例:
nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2]
548 两数组的交II
计算两个数组的交
样例
nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
这俩题的解题思路一样,只是一个不可以输出重复元素,另一个能输出重复元素,共同的一步就是先将两个数组排序,然后
在547两数组的交中通过分别移动数组的下标来判断是否有相同的元素,若有则插入到新数组中去,否则不插,最重要的一点就是
新数组的元素不允许有重复,可以通过设置一个记录最新插入的值的标志,每次要插入时判断新数组里面是否已经有相等的元素
若无相等则插入,否则不插入。548两数组的交II新数组中允许有相同的元素。在547的基础上删一些代码就可以实现。
3 解题代码
两数组的交:
class Solution {
public:
/**
* @param nums1 an integer array
* @param nums2 an integer array
* @return an integer array
*/
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// Write your code here
vector<int> A;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int t;
int i=0;
int j=0;
int n=nums1.size();
int m=nums2.size();
while(i<n&&j<m)
{
if(nums1[i]==nums2[j])
{
if(t!=nums1[i])
A.push_back(nums1[i]);
t=nums1[i];
i++;j++;
}
else if(i<n&&j<m&&nums1[i]<nums2[j])
{
i++;
}
else if(i<n&&j<m&&nums1[i]>nums2[j])
{
j++;
}
}
return A;
}
};
两数组的交II:
class Solution {
public:
/**
* @param nums1 an integer array
* @param nums2 an integer array
* @return an integer array
*/
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// Write your code here
vector<int> A;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int i=0;
int j=0;
int n=nums1.size();
int m=nums2.size();
while(i<n&&j<m)
{
if(nums1[i]==nums2[j])
{
A.push_back(nums1[i]);
i++;j++;
}
else if(i<n&&j<m&&nums1[i]<nums2[j])
{
i++;
}
else if(i<n&&j<m&&nums1[i]>nums2[j])
{
j++;
}
}
return A;
}
};
4 解题思路
这个题需要在自己静下来慢慢想,只要先将两数组的交写出来,两数组的交II只是在前面的基础上删掉几行代码就行,
自己刚开始写两个数组的交的时候用了两个for循环,但是一直出的是空结果,这个其实和链表里面合并两个排序链表有相似之处,
链表里面是将指针指向后移,在数组里面将数组元素的下表后移,改完了之后出的就是重复的元素,问了问同学,设置了一个
标志,就解决了问题,II就是在一的基础上允许可以重复元素。