力扣—349. 两个数组的交集、350

本文详细解析了两个数组交集的算法实现,包括交集I(每个元素唯一)和交集II(考虑元素重复次数)。通过使用HashSet和HashMap,文章展示了如何高效地找到两个数组的公共元素,并讨论了不同情况下的优化策略。

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

 

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

示例 1:

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

示例 2:

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

说明:

  • 输出结果中的每个元素一定是唯一的。
  • 我们可以不考虑输出结果的顺序。

 

思路:

首先把数组的元素都放在set集合中 他说明了 元素是唯一的

然后第二个for是两个数组进行交集

使用contains进行匹配 当且仅当此字符串包含指定的char值序列时,返回true。 如果相同就存放在resultSet中

然后输出

 

 

package com.binglian.lookup;

import java.lang.management.ManagementPermission;
import java.util.TreeSet;

/**
 * 349. Intersection of Two Arrays
 * https://leetcode.com/problems/intersection-of-two-arrays/description/
 * 时间复杂度:O(nlogn)
 * 空间复杂度:O (n)
 * @author binglian
 *
 */
public class LK_349 {
	
	public int[] intersection(int[] nums1, int[] nums2) {
		
		TreeSet<Integer> record=new TreeSet<Integer>();
		for(int num:nums1)
			record.add(num);
		
		TreeSet<Integer> resultSet=new TreeSet<Integer>();
		for(int num:nums2)
			if(record.contains(num))
				resultSet.add(num);
		
		int[] res=new int[resultSet.size()];
		int index=0;
		for(Integer num:resultSet)
			res[index++]=num;
		
		return res;
	}
	
	 private static void printArr(int[] arr){
	        for(int e: arr)
	            System.out.print(e + " ");
	        System.out.println();
	    }

	    public static void main(String[] args) {

	        int[] nums1 = {1, 2, 2, 1};
	        int[] nums2 = {2, 2};
	        int[] res = (new LK_349()).intersection(nums1, nums2);
	        printArr(res);
	    }
}

 

 

使用hashSet

public int[] intersection(int[] nums1, int[] nums2) {

        HashSet<Integer> record = new HashSet<Integer>();
        for(int num: nums1)
            record.add(num);

        HashSet<Integer> resultSet = new HashSet<Integer>();
        for(int num: nums2)
            if(record.contains(num))
                resultSet.add(num);

        int[] res = new int[resultSet.size()];
        int index = 0;
        for(Integer num: resultSet)
            res[index++] = num;

        return res;
    }

350. 两个数组的交集 II 

 

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

示例 1:

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

示例 2:

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

说明:

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

进阶:

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

 

 

package com.binglian.lookup;

import java.util.ArrayList;
import java.util.TreeMap;

/**
 * 350. Intersection of Two Arrays II
 * https://leetcode.com/problems/intersection-of-two-arrays-ii/description/
 * 时间复杂度:O(nlogn)
 * 空间复杂度:O(n)
 * 使用map key是元素 而value就是多个元素
 * @author binglian
 *
 */
public class LK_350 {

	public int[] intersect(int[] nums1, int[] nums2) {
		TreeMap<Integer, Integer> record=new TreeMap<Integer, Integer>();
		for(int num:nums1)
			if(!record.containsKey(num))
				record.put(num, 1);
			else
				record.put(num, record.get(num)+1);
		
		ArrayList<Integer> result=new ArrayList<Integer>();
		for(int num:nums2){
			if(record.containsKey(num) && record.get(num) > 0){
				result.add(num);
				record.put(num, record.get(num)-1);
			}
		}
		
		int[] ret=new int[result.size()];
		int index=0;
		for(Integer num:result)
			ret[index++]=num;
		
		
		return ret;
	}
	
	private static void printArr(int[] arr){
        for(int e: arr)
            System.out.print(e + " ");
        System.out.println();
    }

    public static void main(String[] args) {

        int[] nums1 = {1, 2, 2, 1};
        int[] nums2 = {2, 2};
        int[] res = (new LK_350()).intersect(nums1, nums2);
        printArr(res);
    }
}

 

 

public int[] intersect(int[] nums1, int[] nums2) {

        HashMap<Integer, Integer> record = new HashMap<Integer, Integer>();
        for(int num: nums1)
            if(!record.containsKey(num))
                record.put(num, 1);
            else
                record.put(num, record.get(num) + 1);

        ArrayList<Integer> result = new ArrayList<Integer>();
        for(int num: nums2)
            if(record.containsKey(num) && record.get(num) > 0){
                result.add(num);
                record.put(num, record.get(num) - 1);
            }

        int[] ret = new int[result.size()];
        int index = 0;
        for(Integer num: result)
            ret[index++] = num;

        return ret;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值