题目描述:
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
解题方法一:双指针法 (解题方法参考leetcode作者:demigodliu)
先行将数组排序,方便我们查找:
1、创建一个指针 i指向 nums1 数组首位,指针 j指向 nums2 数组首位。
2、创建一个临时栈,用于存放结果集。
3、开始比较指针 i和指针 j 的值大小,若两个值不等,则数字小的指针,往右移一位。
4、若指针 i 和指针 j 的值相等,则将交集压入栈。
5、若 nums 或 nums2 有一方遍历结束,代表另一方的剩余值,都是唯一存在,且不会与之产生交集的。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//双指针
Arrays.sort(nums1);
Arrays.sort(nums2);
int length1 = nums1.length;
int length2 = nums2.length;
int[] nums3 = new int[Math.min(length1,length2)];
int index1=0,index2=0,index3=0;
while(index1<length1 && index2<length2){
if(nums1[index1] < nums2[index2]){
index1++;
}else if(nums1[index1] > nums2[index2]){
index2++;
}else if(nums1[index1] == nums2[index2]){
nums3[index3] = nums1[index1];
index1++;
index2++;
index3++;
}
}
return Arrays.copyOfRange(nums3,0,index3);
}
}
运行结果:
解题方法二:标记法
1、先将两个数组进行长度判断,设置一个布尔数组(长度为两个数组中长的那一方的长度),全部值设置为true
2、然后进行遍历,将重复出现位置的值换成false
3、然后根据false的索引值对长的那一方的数组进行赋值到新的数组即可得到交集
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int[] c;
int[] d;
Boolean[] booleans;
if (nums1.length>=nums2.length){
c=nums1;
d=nums2;
}else {
c=nums2;
d=nums1;
}
booleans=new Boolean[c.length];
for (int i = 0; i < booleans.length; i++) {
booleans[i]=true;
}
int sum=0;
for (int i = 0; i < d.length; i++) {
for (int j = 0; j < c.length; j++) {
if (booleans[j].booleanValue()){
if (d[i]==c[j]){
booleans[j]=false;
sum++;
break;
}
}
}
}
int[] ints = new int[sum];
int index=0;
for (int i = 0; i < booleans.length; i++) {
if (!booleans[i]){
ints[index]=c[i];
index++;
}
}
return ints;
}
}
提交结果:
解法三:
1、先将两个数组进行判断,nums1强制 成 长的数组,nums2为短的数组,新建nums3记录两个数组的交集,交集小于或等于nums2
2、将nums1数组进行遍历放入hashMap中,key记录数组元素,value记录出现次数
3、遍历查找map中是否有nums2中的元素,若有且当出现次数大于0的时候赋给nums3,然后出现次数减一
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int[] nums3;
if (nums1.length>=nums2.length){
nums3 = new int[nums2.length];
}else {
nums3 = new int[nums1.length];
int[] a=nums1;
nums1 = nums2;
nums2 = a;
}
HashMap<Integer,Integer> map=new HashMap<>();
for (int i = 0; i < nums1.length; i++) {
if (map.containsKey(nums1[i])){
map.put(nums1[i],map.get(nums1[i])+1);
}else {
map.put(nums1[i],1);
}
}
int index=0;
for (int i = 0; i < nums2.length; i++) {
if (map.containsKey(nums2[i])){
if (map.get(nums2[i])>0){
nums3[index]=nums2[i];
index++;
map.put(nums2[i],map.get(nums2[i])-1);
}
}
}
return Arrays.copyOfRange(nums3,0,index);
}
}
运行结果: