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);
    }
相关推荐
while(1){yan}25 分钟前
数据结构之链表
数据结构·链表
Han.miracle2 小时前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
Le1Yu3 小时前
分布式事务以及Seata(XA、AT模式)
java
寒山李白4 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
mit6.8244 小时前
前后缀分解
算法
独自破碎E5 小时前
判断链表是否为回文
数据结构·链表
你好,我叫C小白5 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
无妄无望5 小时前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科5 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20165 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构