题目:350. 两个数组的交集 II
方法一:哈希表来存储nums1的元素情况,时间复杂度0(n)。
C++版本:
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int,int> mp;
for(auto x:nums1){
mp[x]++;
}
vector<int> v;
for(auto x:nums2){
if(mp[x]>0){
v.push_back(x);
mp[x]--;
}
}
return v;
}
};
JAVA版本:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer,Integer> mp = new HashMap<>();
for(var x:nums1){
mp.merge(x,1,Integer::sum);
}
List<Integer> v =new ArrayList<>();
for(var x:nums2){
if(mp.getOrDefault(x,0)>0){
mp.merge(x,-1,Integer::sum);
v.add(x);
}
}
return v.stream().mapToInt(i -> i).toArray();
}
}
Go版本:
func intersect(nums1 []int, nums2 []int) []int {
mp := map[int]int{}
for _,x:= range nums1 {
mp[x]++
}
ans := make([]int,0)
for _,x:= range nums2 {
if mp[x]>0 {
mp[x]--
ans=append(ans,x)
}
}
return ans
}
方法二:双指针,看num2中的数和nums1匹配上多少,时间复杂度0(n+m)。如果非有序的话,0(nlogn)。
C++版本:
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int i=0,j=0;
vector<int> v;
while(i<nums1.size()&&j<nums2.size()){
if(nums1[i]<nums2[j]){
i++;
}else if(nums1[i]>nums2[j]){
j++;
}else{
v.push_back(nums1[i]);
i++,j++;
}
}
return v;
}
};
JAVA版本:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
List<Integer> v= new ArrayList<>();
int i=0,j=0;
while(i<nums1.length &&j<nums2.length){
if(nums1[i]<nums2[j]){
i++;
}else if(nums1[i]>nums2[j]){
j++;
}else{
v.add(nums1[i]);
i++;
j++;
}
}
return v.stream().mapToInt(x->x).toArray();
}
}
Go版本:
func intersect(nums1 []int, nums2 []int) []int {
slices.Sort(nums1)
slices.Sort(nums2)
i,j := 0,0
ans := make([]int,0)
for i<len(nums1) && j<len(nums2) {
if nums1[i]<nums2[j] {
i++;
}else if nums1[i]>nums2[j] {
j++;
}else {
ans=append(ans,nums1[i])
i++
j++
}
}
return ans
}