题目描述:
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2]
.
Note:
- Each element in the result must be unique.
- The result can be in any order.
解题思路(1):题意要我们找出俩个数组的共同部分,并且保存不重复的值,第一种方法我们可以将俩个数组都进行排序(当碰到数组问题,排序后一定会比 不排序有思路,好做(只要运行复杂度在排序复杂度之内即可)),那么我们可以用俩个指针来指向俩个数组,碰到相等的时候,就记录,但是注意由于结果是不重复的,那么我保存结果用集合即可,此算法时间复杂度为0(m+n),假设m,n分别为俩个数组的长度~java代码如下:
public class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0;
int j = 0;
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
i++;
} else if (nums1[i] > nums2[j]) {
j++;
} else {
set.add(nums1[i]);
i++;
j++;
}
}
int[] result = new int[set.size()];
int k = 0;
for (Integer num : set) {
result[k++] = num;
}
return result;
}
}
解题思路(3):用hash来做,扫描第一个数组的时候,记录在hash表中,然后扫描第二个数组,碰到大于0的就记录,并且此时立即清空,为了防止记录重复的,C++,python代码如下
C++代码:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int>res;
map<int,int>Map;
int len1 = nums1.size(),len2 = nums2.size(),i;
for(i = 0;i<len1;i++)
{
Map[nums1[i]]++;
}
for(i = 0;i<len2;i++)
{
if(Map[nums2[i]]>0)
{
res.push_back(nums2[i]);
Map[nums2[i]] = 0; //因为它不允许重复的,那么在这里就一定要清零
}
}
return res;
}
};
python代码:
class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
len1 = len(nums1)
len2 = len(nums2)
Map = {}
res = []
for i in range(len1):
if nums1[i] not in Map:
Map[nums1[i]]=1
else:
Map[nums1[i]]+=1
for i in range(len2):
if nums2[i] in Map:
res.append(nums2[i])
del Map[nums2[i]] #删除了为nums2[i]这项
return res
知乎主页:忆臻
专栏地址:机器学习算法
博客地址:
忆臻博客