算法小知识-----10.18----- 两个数组的交集

42 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

无惊无险又月中了,最近天气开始转凉,但是还是不能放松自己

两个数组的交集

该题出自力扣的349题 —— 两个数组的交集【简单题】

审题

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

  • 该题的题意并不难,因为是简单题,所以相对来说条件会宽松一点,顾名思义就是给出两个数组,找出两个数组的交集并且存储到一个数组内部返回
  • 那么这道题的解法:利用排序+双指针
    • 因为返回的是数组,但是并不知道最终可以有多少个交集,因此使用集合List,并且最终的时候利用stream流去汇总list转换成数组
    • 先对两个数组进行排序,可以预见的是加入答案的数组的元素一定是递增的,为了保证加入元素的唯一性,我们需要额外记录变量
    • 定义两个数组的当前下标,并且定义两个数组的长度变量
    • while循环两个下标是否达到数组的长度,因为有一个超出长度,排序后的数组必定不再与前一个数组有交集
    • 如果包含的话,直接下标 + 1,作为查重
    • 判断是否大于或者小于,每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等则加入list

编码

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        List<Integer> list = new ArrayList<>();
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int len1 = nums1.length,len2 = nums2.length;
        int index1 = 0,index2 = 0;
        while (len1 != index1 && len2 != index2){
            if (list.contains(nums1[index1])){
                index1++;
                continue;
            }else if (list.contains(nums2[index2])){
                index2++;
                continue;
            }

            if (nums1[index1] > nums2[index2]){
                index2++;
            }else if (nums1[index1] < nums2[index2]){
                index1++;
            }else {
                list.add(nums1[index1]);
                index1++;
                index2++;
            }

        }
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

image.png