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

这篇博客详细介绍了如何解决LeetCode上的第350题,即找出两个给定数组的交集。内容涵盖了解题思路、算法实现以及可能的优化策略,对于学习和提升编程技巧尤其是数组操作和哈希表应用有所帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package leetcode.sort;

import java.util.*;
/**
* @Description: 两个数组的交集
 * 给定两个数组,编写一个函数来计算它们的交集。

示例 1:

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

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

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
进阶:

1.如果给定的数组已经排好序呢?你将如何优化你的算法?
可以从头开始比较,相同放在交集内,不同比较大小,前后移动指针

2.如果 nums1 的大小比 nums2 小很多,哪种方法更优?
可以使用第一种,将nums1的值当做比较基准,可以减少比较次数

3.如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
将nums1的值当做比较基准,去nums2内的值,取到某处做记录,比较完取交集之后取剩下的值
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* @Param:
* @return:
* @Author: lvhong
* @Date:
* @E-mail lvhong282@163.com
*/
public class lab350 {
    public static void main(String[] args) {
        int[] input1 = { 1,2,2,1};
        int[] input2 = { 2,2};
        System.out.println(merge(input1, input2));

    }
/**
* @Description:时间复杂度为O(n),空间复杂度为O(n)
* @Param:
* @return:
* @Author: lvhong
* @Date:
* @E-mail lvhong282@163.com
*/
    public static int[] merge(int[] in1, int[] in2) {//方法1:HahsMap依次put每一个num1的值,相同的值value加一   ,最后 LinkedList里面加入判定得到最后的输出,再转化为数组输出
        //HahsMap依次put每一个num1的值,相同的值value加一
        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        for (int number1 : in1) {
            if (hashMap.containsKey(number1)) {
                hashMap.put(number1, hashMap.get(number1) + 1);
            } else {
                hashMap.put(number1, 1);
            }
        }
        //如果第二个数组内的元素出现在第一个数组内,,则为交集元素,放在LinkedList里面,同时将其value减一
        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        for (int number2 : in2) {
            if (hashMap.containsKey(number2) && hashMap.get(number2) > 0) {
                linkedList.add(number2);
                hashMap.put(number2, hashMap.get(number2) - 1);
            }
        }

            //最后将LinkedLst里面的值输出到数组
        int length = linkedList.size();
        int[] out = new int[length];
        for (int i = 0; i < length; i++) {
            out[i] = linkedList.poll();
        }

        return out;
    }
	
    /** 
    * @Description: 时间复杂度为O(nlogn),额外空间复杂度为O(1) 
    * @Param:  
    * @return:  
    * @Author: lvhong
    * @Date:  
    * @E-mail lvhong282@163.com
    */ 
	public int[] intersect(int[] nums1, int[] nums2) {  //先对数组内的元素排序,可以从头开始比较,相同放在交集内,不同比较大小,前后移动指针
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        List<Integer> list = new ArrayList<Integer>(nums1.length);
        int i=0;
        int j=0;
       for (;i<nums1.length&&j<nums2.length;){
            if(nums1[i]==nums2[j]){
                list.add(nums1[i]);
                i++;
                j++;
            }
            else if (nums1[i]<nums2[j]){
                i++;
            }
            else{
                j++;
            }
        }
        
        int [] out = new int[list.size()];
        int n=0;
        for(Integer number : list){
            out[n++]=number;
        }
        
        
    return out;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值