题目描述

java set取交集 stream java 两个set取交集_两个指针


做法1

思路
第一步:先初始化两个Set集合,Set集合的特点是里面的元素是无序的,不能根据索引操作,然后里面不可以有重复元素,这样就帮我们把重复的相同元素去掉了
第二步:把数组1中的所有元素添加到集合Set1中,然后在遍历数组2 nums2 第三步: 判断集合Set1中是否存在nums2中的元素
第四步:如果存在就把他们单独的放在另一个set2集合中,set2中存放的就是num1数组中和nums2数组的交集
第五步:在这个set2集合转为数组然后返回结果。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set <Integer> set1 = new HashSet<>();
        Set <Integer> set2 = new HashSet<>();
        for(int i = 0;i < nums1.length;i++){//循环遍历数组1
            set1.add(nums1[i]);//把他添加到集合中
        }
        for(int i = 0; i< nums2.length;i++){//循环遍历数组2
            if(set1.contains(nums2[i])){//如果集合1中包含数组2中的元素,contains这个是集合中的包含方法
                set2.add(nums2[i]);//添加到集合2中
            }
        }
        //把set2集合转换为数组
        int i = 0;
        int[]  arr = new int [set2.size()];
        for(Integer num : set2){//这里用增强for循环,因为用set集合是无序的,没发根据索引遍历,用普通的for循环遍历就是用索引遍历
           arr[i++] = num;
        }
        return arr;
    }
}

做法-双指针

第一步:对两个数组进行排序
第二步:定义两个指针,一个指向数组1的第一个元素,一个指向数组2的第一个元素
第三步:用着两个指针遍历数组,如果这两个指针指向的值是一样的,就把他加入到集合中,如果两个指针指向的值不一样,就把指向小的值的指针像右移动一位。

java set取交集 stream java 两个set取交集_数组_02


i 指针指向的值不等于j指针指向的值,i指针向右移动一位.

java set取交集 stream java 两个set取交集_leetcode_03


i指针指向的元素=j指针指向的元素,然后我们把这个元素添加到我们定义的集合中,之后分别移动i,j指针.

java set取交集 stream java 两个set取交集_i++_04


i 指针指向的值不等于j指针指向的值,这两个指针也分别到了数组的结尾,结束循环.

//用set集合,set集合去重,不懂单独去重
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        //先对两个数组进行排序
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0;//定义第i指针指向数组1
        int j = 0;//定义第j指针指向数组2
        Set<Integer> mset = new HashSet<>();
        while (i < nums1.length && j < nums2.length) {
            //这里思路可以参照归并排序。使用两个指针,只有nums1[i] == nums2[j]
            //的时候,他们才有交集,否则值小的指针往后移
            if (nums1[i] < nums2[j]) {
                i++;
            } else if (nums1[i] > nums2[j]) {
                j++;
            } else {
                //使用的是list
              
                mset.add(nums1[i]);
                i++;
                j++;
            }
        }
        //这一大坨是把集合mset转化为数组
        int k = 0;
        int[] res = new int[mset.size()];
        for (Integer num : mset) {
            res[k++] = num;
         }
        return res;
    }
}
class Solution {
      public int[] intersection(int[] nums1, int[] nums2) {
        //先对两个数组进行排序
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0;//数组1的指针
        int j = 0;//数组2的指针
        List<Integer> mList = new ArrayList<>();
        while (i < nums1.length && j < nums2.length) {
            //使用两个指针,只有nums1[i] == nums2[j]的时候,他们才有交集,否则值小的指针往后移
            if (nums1[i] < nums2[j]) {
                i++;
            } else if (nums1[i] > nums2[j]) {
                j++;
            } else {
                //这里是去掉重复的,使用的是list
                if (mList.size() == 0 || mList.size() > 0 && mList.get(mList.size() - 1) != nums1[i])
                    mList.add(nums1[i]);
                i++;
                j++;
            }
        }
        //把集合list转化为数组
        int[] res = new int[mList.size()];
        for (int k = 0; k < mList.size(); k++) {
            res[k] = mList.get(k);
        }
        return res;
    }
}