Leetcode2856. 删除数对后的最小数组长度

Every day a Leetcode

题目来源:2856. 删除数对后的最小数组长度

解法1:哈希 + 分类讨论

假设数组 nums 中元素 x 出现次数最多,其出现次数为 maxCount。

分类讨论:

  • 如果 2 * maxCount > n,其余所有 n − maxCount 个数都要与 x 消除,所以最后剩下 n - 2 * (n-maxCount) = 2 * maxCount - n 个数。
  • 如果 2 * maxCount <= n 且 n 是偶数,那么可以把其余数消除至剩下 maxCount 个数,然后再和 x 消除,最后剩下 0 个数。
  • 如果 2 * maxCount <= n 且 n 是奇数,同上,最后剩下 1 个数。

代码:

/*
 * @lc app=leetcode.cn id=2856 lang=cpp
 *
 * [2856] 删除数对后的最小数组长度
 */

// @lc code=start

// 哈希 + 分类讨论

class Solution
{
public:
    int minLengthAfterRemovals(vector<int> &nums)
    {
        // 特判
        if (nums.empty())
            return 0;

        int n = nums.size();
        // 统计数组 nums 中各元素的出现次数
        unordered_map<int, int> cnt;
        for (int &num : nums)
            cnt[num]++;

        int maxCount = 0;
        for (auto &[_, c] : cnt)
            maxCount = max(maxCount, c);

        return max(2 * maxCount - n, n % 2);
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 nums 的元素个数。

空间复杂度:O(n),其中 n 是数组 nums 的元素个数。

解法2:二分查找 + 分类讨论

但我们还可以更快!

由于数组 nums 是有序的,如果 maxCount 超过数组长度的一半,那么 nums[n/2] 一定是出现次数最多的那个数!

可以用二分查找在 O(log⁡n) 的时间计算 nums[n/2] 第一次和最后一次出现的位置,从而算出 maxCount。

代码:

// 二分查找 + 分类讨论

class Solution
{
public:
    int minLengthAfterRemovals(vector<int> &nums)
    {
        // 特判
        if (nums.empty())
            return 0;

        int n = nums.size();
        int x = nums[n / 2];
        int maxCount = upper_bound(nums.begin(), nums.end(), x) -
                       lower_bound(nums.begin(), nums.end(), x);
        if (maxCount > n / 2)
            return 2 * maxCount - n;
        return n % 2;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(logn),其中 n 是数组 nums 的元素个数。

空间复杂度:O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/366736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mars3d实现【按当前相机视域页在地球上投射视频】功能

通过mars3d实现按当前相机视域页在地球上投射视频进行视频投射效果&#xff1a; 相关代码&#xff1a; // 按当前相机投射视频 export function startDrawGraphic2() {const ellipsoid map.scene.globe.ellipsoidconst canvas map.scene.canvasconst pt1 map.camera.pickE…

FluxMQ:新一代的高性能MQTT代理服务器

FluxMQ&#xff1a;新一代的高性能MQTT代理服务器 前言 FLuxMQ是一款基于java开发&#xff0c;支持无限设备连接的云原生分布式物联网接入平台。FluxMQ基于Netty开发&#xff0c;底层采用Reactor3反应堆模型&#xff0c;具备低延迟&#xff0c;高吞吐量&#xff0c;千万、亿级…

ClickHouse基于数据分析常用函数

文章标题 一、WITH语法-定义变量1.1 定义变量1.2 调用函数1.3 子查询 二、GROUP BY子句&#xff08;结合WITH ROLLUP、CUBE、TOTALS&#xff09;三、FORM语法3.1表函数3.1.1 file3.1.2 numbers3.1.3 mysql3.1.4 hdfs 四、ARRAY JOIN语法&#xff08;区别于arrayJoin(arr)函数&a…

创建自己的Hexo博客

目录 一、Github新建仓库二、支持环境安装Git安装Node.js安装Hexo安装 三、博客本地运行本地hexo文件初始化本地启动Hexo服务 四、博客与Github绑定建立SSH密钥&#xff0c;并将公钥配置到github配置Hexo与Github的联系检查github链接访问hexo生成的博客 一、Github新建仓库 登…

完整的 HTTP 请求所经历的步骤及分布式事务解决方案

1. 对分布式事务的了解 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c; 特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 首先要搞清楚&#xff1a;ACID、CAP、BASE理论。 ACID 指数据库事务正确执行…

小程序中picker多列选择器

需求&#xff1a;实现类似省市联动的效果&#xff0c;选择第一列后&#xff0c;第二列数据变化 html部分: <view class"section"><view>多列选择器</view><picker mode"multiSelector" bindchange"bindMultiPickerChange"…

大模型实践笔记(1)——GLM-6B实践

目录 在Ubuntu上的配置Git Large File Storage 安装Git LFS&#xff1a; 设置Git LFS&#xff1a; 使用Git LFS&#xff1a; 安装GLM-6B 环境依赖 ChatGLM2-6B介绍 配置GLM 下载代码 构建环境 安装依赖 本地部署 网页UI 很多模型在hugging face上面&#xff0c;…

Pudgy Penguins NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;Pudgy Penguins NFT Collection Dashboard “胖企鹅” Pudgy Penguins NFT 系列是由 8,888 个独特的企鹅头像组成的以太坊区块链项目。这个 NFT 项目能否在 2024 年达到发展的高峰&#xff1f; 关于 Pudgy Pe…

微信小程序新手入门教程三:基础语法介绍

WXML&#xff08;WeiXin Markup Language&#xff09;是框架设计的一套标签语言&#xff0c;可以与各种组件相结合&#xff0c;进行页面构建。 一 常用标签 wxml的语法结构与我们熟悉的html很像&#xff0c;但在细节处略有不同&#xff0c;我们可以参考html标签对比记忆。wxm…

12.scala下划线使用总结

目录 概述实践变量初始化导包引入方法转变为函数用户访问Tuple元素简化函数参数传递定义偏函数变长参数 结束 概述 实践 变量初始化 在Scala中&#xff0c;变量在声明时需要显式指定初始值。可以使用下划线为变量提供初始值&#xff0c;但这种语法仅限于成员变量&#xff0c;…

IDEA反编译Jar包

反编译步骤 使用IDEA安装decompiler插件 找到decompiler插件文件夹所在位置&#xff08;IDEA安装路径/plugins/java-decompiler/lib &#xff09;&#xff0c;将需要反编译的jar包放到decompiler插件文件夹下&#xff0c;并创建一个空的文件夹&#xff0c;用来存放反编译后的…

前端玩Word:Word文档解析成浏览器认识的HTML

前言 领导跟富文本编辑器杠上啦&#xff0c;领导有一个类似于某雀导入Word文档&#xff0c;解析内容后渲染到编辑器编辑的需求。某雀功能效果如下&#xff1a; 怎么搞定呢&#xff1f;自己写一个解析器&#xff1f; 本文分享Word文件转换成浏览器认识的HTML实战经验。 什么是…

springboot项目引入redis数据库的简单使用案例

springboot项目引入redis数据库的简单使用案例&#xff01;很多项目都需要使用到redis数据库&#xff0c;这是一个内存型的&#xff0c;非关系型数据库。它的读取速度非常快。因为存在了内存中。不是在硬盘中。而且它可以解决很多棘手的问题&#xff0c;比如&#xff1a;解决一…

Django的web框架Django Rest_Framework精讲(二)

文章目录 1.自定义校验功能&#xff08;1&#xff09;validators&#xff08;2&#xff09;局部钩子&#xff1a;单字段校验&#xff08;3&#xff09;全局钩子&#xff1a;多字段校验 2.raise_exception 参数3.context参数4.反序列化校验后保存&#xff0c;新增和更新数据&…

项目开发 多行编辑

问题 项目开发中&#xff0c;如何进行多行编辑 详细问题 笔者使用IDEA&#xff0c;Android Studio进行项目开发时&#xff0c;由于代码冗余&#xff0c;修改过程中若是逐一删除或编辑&#xff0c;效率相对低&#xff0c;如何进行多行删除或编辑 本文将提供IDEA&#xff0c;A…

152基于matlab的GUI滚动轴承特征频率计算

基于matlab的GUI滚动轴承特征频率计算&#xff0c;输入轴承参数&#xff0c;包括转速&#xff0c;节圆直径、滚子直径、滚子数、接触角&#xff0c;就可得滚动特征频率结果&#xff0c;程序已调通&#xff0c;可直接运行。 152 matlab 轴承特征频率 GUI (xiaohongshu.com)

MongoDB的分片集群(一) : 基础知识

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 目录导读 1. 什么是MongoDB分片 2. MongoDB分片集群介绍 2.1 MongoDB分片集群架构 2.2 MongoDB分片集群优势 3. 分片键…

排序(5)——归并排序

六、归并排序 1.简介 归并排序也是一种很经典的排序算法&#xff0c;采用分治的思想方法进行数据的处理。归并讲究的是先拆后合&#xff0c;也就是分治中的分而治之。在拿到一组数据后&#xff0c;程序会将整个数据进行不断拆分直至有序&#xff0c;因为单个元素必然有序&…

【类和对象】4

日期类的拓展 c语言中的printf函数只能打印内置类型&#xff0c;为了弥补这一不足&#xff0c;c利用运算符重载可以打印自定义类型。 void operator<<(ostream&out);//声明在date.h中void Date::operator<<(ostream& out)//定义在date.cpp中 {out<<…

Flutter解析后台发来的jwt字段数据,了解jwt是否过期

前言 了解JWT是什么可以看这一篇博文 JWT&#xff08;JSON Web Token&#xff09;详解以及在go-zero中配置的方法-CSDN博客 流程 采用jwt_decoder库 添加至pubspec.yaml jwt_decoder: ^2.0.1 解析字段 查看是否过期 获取过期时间和token颁发的年龄
最新文章