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);
    }
相关推荐
秀儿还能再秀1 分钟前
机器学习:决策树——ID3算法、C4.5算法、CART算法
算法·决策树·机器学习
斗-匕5 分钟前
Spring & Spring Boot 常用注解总结
java·spring boot·spring
秀儿还能再秀5 分钟前
机器学习:梯度提升树(GBDT)——基于决策树的树形模型
算法·决策树·机器学习·学习笔记·梯度提升树
夏微凉.7 分钟前
【JavaEE进阶】Spring 事务和事务传播机制
java·数据库·sql·mysql·spring·java-ee
yangpipi-7 分钟前
数据结构(C语言版)-2.栈和队列
c语言·开发语言·数据结构
bcbobo21cn10 分钟前
C语言不创建中间变量交换2个数
数据结构·异或·交换2数
还在学习进步10 分钟前
C语言第九周课——经典算法
c语言·开发语言·算法
吴冰_hogan11 分钟前
nacos集群源码解析-cp架构
java·spring boot·spring·架构·服务发现·springcloud
阿七想学习12 分钟前
数据结构《链表》
java·开发语言·数据结构·学习·链表
Yaml413 分钟前
Java的六大排序
java·算法·排序算法