LeetCode-移除后集合的最多元素数(java)

题目要求

给你两个下标从 0 开始的整数数组 nums1nums2 ,它们的长度都是偶数 n

你必须从 nums1 中移除 n / 2 个元素,同时从 nums2 中也移除 n / 2 个元素。移除之后,你将 nums1nums2 中剩下的元素插入到集合 s 中。

返回集合 s可能的最多包含多少元素。

示例 1:

复制代码
输入:nums1 = [1,2,1,2], nums2 = [1,1,1,1]
输出:2
解释:从 nums1 和 nums2 中移除两个 1 。移除后,数组变为 nums1 = [2,2] 和 nums2 = [1,1] 。因此,s = {1,2} 。
可以证明,在移除之后,集合 s 最多可以包含 2 个元素。

示例 2:

复制代码
输入:nums1 = [1,2,3,4,5,6], nums2 = [2,3,2,3,2,3]
输出:5
解释:从 nums1 中移除 2、3 和 6 ,同时从 nums2 中移除两个 3 和一个 2 。移除后,数组变为 nums1 = [1,4,5] 和 nums2 = [2,3,2] 。因此,s = {1,2,3,4,5} 。
可以证明,在移除之后,集合 s 最多可以包含 5 个元素。 

示例 3:

复制代码
输入:nums1 = [1,1,2,2,3,3], nums2 = [4,4,5,5,6,6]
输出:6
解释:从 nums1 中移除 1、2 和 3 ,同时从 nums2 中移除 4、5 和 6 。移除后,数组变为 nums1 = [1,2,3] 和 nums2 = [4,5,6] 。因此,s = {1,2,3,4,5,6} 。
可以证明,在移除之后,集合 s 最多可以包含 6 个元素。 

题目解析

题目中要求两个数组各取一半,得出集合中最多可以包含几个元素。本题的难点在于如何在数组中挑选出数字,使集合中的元素最多。

对此,我们利用添加的思想,先得出两个数组中各自具有的数字,也就是不在这两个数组交集之中的数字,先将这些数字添加进集合。如果数组中各自具有的元素超过长度的一半,则挑选出等于数组长度一半的数字。

因此假设数组长度为n,交集数量为repeat,那就先要添加c个数字,c=min(n-repeat,n/2)。

数组一中选c1个,数组二中选c2个。

此时选完后如果c1+c2<n,那就证明好可以挑选n-c1-c2个数字,这些数字要从交集repeat中选,最多不能超过repeat个,因此还要加上min(n-c1-c2,repeat)个数字。

所有要选c1+c2+min(n-c1-c2,repeat)个数字->min(n, c1 + c2 + repeat)。

实现代码

java 复制代码
    public int maximumSetSize(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();
        for (int x : nums1) {
            set1.add(x);
        }
        int repeat = 0;
        for (int x : nums2) {
            if (set2.contains(x)) {
                continue;
            }
            set2.add(x);
            if (set1.contains(x)) {
                repeat++;
            }
        }
        int n = nums1.length;
        int c1 = Math.min(set1.size() - repeat, n / 2);
        int c2 = Math.min(set2.size() - repeat, n / 2);
        return Math.min(n, c1 + c2 + repeat);
    }
相关推荐
无限的鲜花7 小时前
反射(原创推荐)
java·开发语言
IT二叔7 小时前
Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署
java·ci/cd·持续部署
一路向北he7 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
QiLinkOS7 小时前
第三视觉理解徐玉生与他的商业活动(30)
大数据·c++·人工智能·算法·开源协议
疯狂打码的少年8 小时前
【操作系统】页面置换算法(OPT/FIFO/LRU)
算法
超级数据查看器8 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
小O的算法实验室8 小时前
2026年CIE,优化客货协同运输:综合地铁系统的列车容量动态分配
算法
Coder_Shenshen9 小时前
西门子S7CommPlus协议鉴权算法原理与流程详解
网络·后端·算法
折哥的程序人生 · 物流技术专研9 小时前
《Java 100 天进阶之路》第50篇:阻塞队列与并发容器(2026版)
java·面试题·java进阶·blockingqueue·并发容器·集合源码·java100天进阶
ai_coder_ai9 小时前
编写自动化脚本,在自己后端服务中使用Open Api进行设备相关操作
java·运维·自动化