第十一个算法-两个数组的交集

Posted liutian1912

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十一个算法-两个数组的交集相关的知识,希望对你有一定的参考价值。

给定两个数组,写一个方法来计算它们的交集。

例如:
给定 nums1 = [1, 2, 2, 1]nums2 = [2, 2], 返回 [2, 2].

注意:

    •    输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
    •    我们可以不考虑输出结果的顺序。

 

思路:

  1,先排序

  2,定义第二个数组的循环节点,为了匹配重复数据

  3,双循环排序

代码:

public int[] intersect(int[] nums1, int[] nums2) {

Arrays.sort(nums1);
Arrays.sort(nums2);
int stag = 0;
int stag1 = 0;

for (int i = 0; i <nums1.length ; i++) {

for (int j = stag; j <nums2.length ; j++) {
if(nums1[i] == nums2[j]){
stag = j+1;
nums1[stag1] = nums1[i];
stag1++;
break;
}

}
}
int[] nums3 = new int[stag1];

System.arraycopy(nums1,0,nums3,0,stag1);
return nums3;
}

别人好的算法:
public int[] intersect(int[] nums1, int[] nums2) {

Arrays.sort(nums1);
Arrays.sort(nums2);
int[] s = nums1.length<nums2.length?nums1:nums2;
int[] l = nums1.length<nums2.length?nums2:nums1;
int[] a = new int[s.length];
int k = 0;
int i = 0;
int j = 0;
while (i<s.length&&j<l.length)
{
if(s[i]<l[j])
{
i++;
}else if(s[i]>l[j])
{
j++;
}else
{
a[k] = s[i];
i++;
j++;
k++;
}
}
int[] r = new int[k];
System.arraycopy(a, 0, r, 0, k);
return r;
}


又是很长的时间,真是头疼。感觉太浪费时间了。

以上是关于第十一个算法-两个数组的交集的主要内容,如果未能解决你的问题,请参考以下文章

前端与算法 leetcode 350. 两个数组的交集 II

c语言中有没有比较简单的算法来判断两个集合有交集

代码随想录算法训练营第六天 | 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和

代码随想录算法训练营第六天 | 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和

LeetCode算法题详解之两个数组的交集

数据结构与算法之深入解析“两个数组的交集”的求解思路与算法示例