leetcode练习 两个数组的交集

文章目录

题目描述

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

示例:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]

题目思路

双集合
最直观的方法是迭代并检查第一个数组 nums1 中的每个值是否也存在于 nums2 中。如果存在,则将值添加到输出。 其中 nm 分别为数组 nums1nums2 的长度。

class Solution {
    
    
    public int[] intersection(int[] nums1, int[] nums2) {
    
    
        HashSet<Integer> set = new HashSet<>();
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0, j = 0;
        while(i < nums1.length && j < nums2.length){
    
    
            if(nums1[i] == nums2[j]){
    
    
                set.add(nums1[i]);
                i++;
                j++;
            }
            else if(nums1[i]<nums2[j]){
    
    
                i++;
            }
            else{
    
    
                j++;
            }
        }
        int [] arr = new int[set.size()];
        int index = 0;
        for (Integer integer : set) {
    
    
            arr[index++] = integer.intValue();
        }
        return arr;
    }
}

双指针
先将nums1 与nums2 排序,然后游走两个指针,情况都写出来了,没有用else

class Solution {
    
    
    public int[] intersection(int[] nums1, int[] nums2) {
    
    
        HashSet<Integer> set = new HashSet<>();
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0, j = 0;
        while(i < nums1.length && j < nums2.length){
    
    
            if(nums1[i] == nums2[j]){
    
    
                set.add(nums1[i]);
                i++;
                j++;
            }
            else if(nums1[i]<nums2[j]){
    
    
                i++;
            }
            else{
    
    
                j++;
            }
        }
        int [] arr = new int[set.size()];
        int index = 0;
        for (Integer integer : set) {
    
    
            arr[index++] = integer.intValue();
        }
        return arr;
    }
}

内置retainAll方法

    public int[] intersection(int[] nums1, int[] nums2) {
    
    
        HashSet<Integer> set1 = new HashSet<>();
        HashSet<Integer> set2 = new HashSet<>();
        for (int i : nums1) {
    
    
            set1.add(i);
        }
        for (int i : nums2) {
    
    
            if (set1.contains(i)) {
    
    
                set2.add(i);
            }
        }
        set1.retainAll(set2);

        int [] output = new int[set1.size()];
        int idx = 0;
        for (int s : set1) output[idx++] = s;
        return output;
    }

猜你喜欢

转载自blog.csdn.net/qq_45019698/article/details/108228682