​LeetCode刷题实战349:两个数组的交集

本文介绍了如何利用不同算法解决LeetCode上的两数组交集问题,包括排序、二分查找和双集合方法,并提供了详细代码实现。通过这些实例,帮助读者提升算法能力,为面试做准备。

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 两个数组的交集,我们先来看题面:

https://leetcode-cn.com/problems/interp-of-two-arrays/

Given two integer arrays nums1 and nums2, return an array of their interp. Each element in the result must be unique and you may return the result in any order.

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

示例

示例 1:

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

示例 2:

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

解题


解法一:set

class Solution {
    public int[] interp(int[] nums1, int[] nums2) {
        // set
        Set<Integer> set = new HashSet<>();
        // 对nums1数组进行排序
        Arrays.sort(nums1);
        // 遍历nums2的每个元素
        for (int num2 : nums2) {
            // 对比nums1中的元素
            for (int num1 : nums1) {
                // 相等保存到set中
                if (num1 == num2) {
                    set.add(num1);
                    break;
                }
                // 如果num1已经大于num2,说明这个数不是交集,跳出循环
                if (num1 > num2) {
                    break;
                }
            }
        }

        // 转成数组
        int[] ret = new int[set.size()];
        int i = 0;
        for (int num : set) {
            ret[i++] = num;
        }
        return ret;
    }
}

解法二:二分查找法

class Solution {
    public int[] interp(int[] nums1, int[] nums2) {
        // 二分查找
        // 对nums1数组进行排序
        Arrays.sort(nums1);

        Set<Integer> set = new HashSet<>();
        // 遍历nums2数组
        for (int target : nums2) {

            // 每个元素都到nums1数组中二分查找
            int l = 0, r = nums1.length - 1;
            while (l <= r) {
                // 取中位下标
                int mid = l + (r - l) / 2;
                if (target < nums1[mid]) {
                    r = mid - 1;
                } else if (target > nums1[mid]) {
                    l = mid + 1;
                } else {
                    // 相等,保存到set中
                    set.add(target);
                    break;
                }
            }

        }

        // 转成数组
        int[] ret = new int[set.size()];
        int i = 0;
        for (int num : set) {
            ret[i++] = num;
        }
        return ret;
    }
}

解法三:双set

class Solution {
    public int[] interp(int[] nums1, int[] nums2) {
        // 双set
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>(); // 存放交集元素
        // 先把nums1数组的所有元素放到set中
        for (int num : nums1) {
            set1.add(num);
        }

        // 遍历nums2数组,如果nums2的元素存在于set1中,放入set2中
        for (int num : nums2) {
            if (set1.contains(num)) {
                set2.add(num);
            }
        }

        // 转成数组
        int[] ret = new int[set2.size()];
        int i = 0;
        for (int num : set2) {
            ret[i++] = num;
        }
        return ret;
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-340题汇总,希望对你有点帮助!

LeetCode刷题实战341:扁平化嵌套列表迭代器

LeetCode刷题实战342:4的幂

LeetCode刷题实战343:整数拆分

LeetCode刷题实战344:反转字符串

LeetCode刷题实战345:反转字符串中的元音字母

LeetCode刷题实战346:数据流中的移动平均值

LeetCode刷题实战347:前 K 个高频元素

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值