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);
    }
相关推荐
Hcoco_me12 小时前
大模型面试题17:PCA算法详解及入门实操
算法
跨境卫士苏苏12 小时前
亚马逊AI广告革命:告别“猜心”,迎接“共创”时代
大数据·人工智能·算法·亚马逊·防关联
HerayChen12 小时前
HbuilderX 内存溢出报错
java·大数据·linux
程序员小白条12 小时前
0经验如何找实习?
java·开发语言·数据结构·数据库·链表
云雾J视界12 小时前
当算法试图解决一切:技术解决方案主义的诱惑与陷阱
算法·google·bert·transformer·attention·算法治理
Xの哲學12 小时前
Linux Miscdevice深度剖析:从原理到实战的完整指南
linux·服务器·算法·架构·边缘计算
小马爱打代码12 小时前
Spring AI:搭建自定义 MCP Server:获取 QQ 信息
java·人工智能·spring
郭涤生12 小时前
QT 架构笔记
java·数据库·系统架构
daidaidaiyu13 小时前
基于LangGraph开发复杂智能体学习一则
java·ai
夏乌_Wx13 小时前
练题100天——DAY23:存在重复元素Ⅰ Ⅱ+两数之和
数据结构·算法·leetcode