leetcode 两个数组的交集II

52 篇文章 1 订阅
23 篇文章 0 订阅

两个数组的交集 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

问题分析:

数组的交集,也就是两个数组都含有的元素,其中包括元素出现的个数
通过List对象,对数据进行寻找后的删除,插入操作,完成交集数据采集

关于排序优化,从小到大进行比较,利用大小关系进行索引值++,借助List完成数据存储,然后进行向数组的转化

代码展示(已验证):

//leetcode 350.两个数组的交集II
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class intersect {
	public static void main(String[] args) {
		int[] nums1 = {4,9,5};
		int[] nums2 = {9,4,9,8,4};
		
		int[] nums = intersect(nums1,nums2);
		for(int num:nums)
			System.out.print(num+" ");
		
		System.out.print("\n");
		
		int[] nums3 = intersect(nums1,nums2);
		for(int num:nums3)
			System.out.print(num+" ");
		
//		System.out.println("两个数组的交集如下: "+intersect(nums1,nums2).toString());
	}

第一种方法,使用两个list寻找交集数据

// 第一种方法,使用两个list寻找交集数据
	static int[] intersect(int[] nums1,int[] nums2)
	{
		//将nums1数组的元素赋值给list1
		List<Integer> list1 = new ArrayList<Integer>();
		for(int num : nums1)
			list1.add(num);
		
		// 创建list2 用来存储两个数组共同拥有的元素
		List<Integer> list2 = new ArrayList<Integer>();
		
		for(int num:nums2)
		{
			if(list1.contains(num))
			{
				list2.add(num);	// 添加
				list1.remove(Integer.valueOf(num));	// 删除已经添加的值
//				list1.remove(num); // Unknown Source
			}
		}
		// 最后return 数组,所以把交集元素复制给数组
		int[] nums = new int[list2.size()];
		int i=0;
		for(int num : list2)
		{
			nums[i++] = num;
		}
		return nums;
	}

第二种方法:排序处理

	//第二种方法:排序处理
	static int[] intersect2(int[] nums1,int[] nums2)
	{
		//排序
		Arrays.sort(nums1);
		Arrays.sort(nums2);
		
		// 创建一个新的数组用来存储相交的数据
		List<Integer> list = new ArrayList<>();
		
		//排序后从小到大进行数据的比较,同时兼顾单一元素出现的次数与数组不同长度的影响
		for(int i=0,j=0;i<nums1.length && j<nums2.length;)
		{
			if(nums1[i]<nums2[i])
				i++;
			else if(nums1[i]>nums2[i])
				j++;
			else {
				list.add(nums1[i]);
				i++;
				j++;
			}
		}
		
		//将list中的元素转给数组,return出来
		int[] res = new int[list.size()];
		for(int i=0;i<list.size();i++)
		{
			res[i] = list.get(i);//.get(index)方法,根据索引寻找元素值
		}
		return res;
	}
}

python3:Colletions.Counter

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:

        c1, c2 = collections.Counter(nums1), collections.Counter(nums2)
        res = []
        for i in c1 & c2:
            res += [i] * min(c1[i], c2[i])
        return res

泡泡:

数组的交集,也就是寻找相同的,要注意单个元素出现的次数和数组的长度
注意java中数组与python中数组不同之处
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值