【LeetCode】2357. 使数组中所有元素都等于零

news2025/7/22 21:46:44

2357. 使数组中所有元素都等于零

题目描述

给你一个非负整数数组 nums 。在一步操作中,你必须:

  • 选出一个正整数 x ,x 需要小于或等于 nums 中 最小 的 非零 元素。
  • nums 中的每个正整数都减去 x。

返回使 nums 中所有元素都等于 0 需要的 最少 操作数。


示例 1

输入:nums = [1,5,0,3,5]
输出:3
解释:
第一步操作:选出 x = 1 ,之后 nums = [0,4,0,2,4] 。
第二步操作:选出 x = 2 ,之后 nums = [0,2,0,0,2] 。
第三步操作:选出 x = 2 ,之后 nums = [0,0,0,0,0] 。


示例 2

输入:nums = [0]
输出:0
解释:nums 中的每个元素都已经是 0 ,所以不需要执行任何操作。


提示

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100

算法一:模拟

思路

  • 一开始先使用 accumulate 函数对数组各元素进行相加,判断数组中各元素是否为 0 ,如果 accumulate 返回 0 ,那么就得到答案 。
  • 首先将各元素按照从小到大的顺序排序,这样比较容易获得 “最小非零元素” ;
  • 遍历排序后的数组 nums ,找到第一个非0元素,也就得到了题目所要求的“最小非零元素”,记为 m;
  • 遍历数组 nums ,将 大于等于 m 的元素都减掉 0,这样就完成了一次操作。

收获

  • 复习了 accumulate 函数的使用;
  • 一开始忘记了相减的前提:该元素大于等于 m ,导致出错。
  • sort(nums.begin(), nums.end()); 默认从小到大排序,每次都会忘记!

算法情况

  • 时间复杂度:O(n logn),即使用 sort 函数所花费的时间。
  • 空间复杂度:O(1)

在这里插入图片描述

代码

class Solution {
public:
    int minimumOperations(vector<int>& nums) {
        int ans = 0, m = 0;
        while(1){
            // 如果nums数组各元素和为0 则问题结束
            if(!accumulate(nums.begin(), nums.end(), 0)) return ans;
            // 排序 使元素从小到大排序
            sort(nums.begin(), nums.end()); 
            for(int & t : nums){
                if(t > 0){
                    m = t;
                    break;
                }
            }
            for(int & t : nums){
                // 减法
                if(t >= m) t -= m;
            }
            ans ++;
        }
    }
};

算法二:哈希表

思路

  • 观察到每次操作都能使得数组中相同且非 0 元素减少到 0 ,因此,只需要统计数组中有多少个不同的非 0 元素即可 ,这就是最小操作数, 可以用哈希表实现。

收获

  • 这个方法更简单,主要是在思路的转换。

算法情况

  • 时间复杂度:O(n),其中 n 为 nums 的长度。
  • 空间复杂度:O(C),其中 C 为 105。

在这里插入图片描述

代码

class Solution {
public:
    int minimumOperations(vector<int>& nums) {
        int ans = 0;
        vector<bool> s(105);
        s[0] = true; // 保证统计的元素都非0
        for(int &x : nums){
            if(!s[x]){
                ans ++;
                s[x] = true; // 不会再统计该元素
            }
        }
        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript速成之路】JavaScript运算符

&#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f525;系列专栏&#xff1a;【JavaScript速成之路】 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文章目录前言运算符1&#xff0c;算术运算符2&#xff0c;递增递减运算符3&#xff0c;比…

VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image)

VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image) VMware ESXi 7.0 Update 3k Standard & All Custom Image for ESXi 7.0 U3k Install CD 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3/&#xff0c;查看最新版。原创作品…

程序员必备的软技能-金字塔原理拆解(上)

原书 290千字&#xff0c;本文预计 14千字&#xff0c;拆解比 20&#xff1a;1&#xff0c;预计阅读时长 15分钟序言日常工作中&#xff0c;常常因为思维、表达方式不对产生不想要的结果&#xff1a;写了一个小时的周报&#xff0c;领导却不满意&#xff1f;跟团队讲了半天自己…

SWMM从入门到实践教程 01 SWMM软件介绍

文章目录1 软件介绍2 软件面板2.1 主菜单2.1.1文件菜单&#xff08;File&#xff09;2.1.2 编辑菜单&#xff08;Edit&#xff09;2.1.3 视图菜单&#xff08;View&#xff09;2.1.4 工程菜单&#xff08;Project&#xff09;2.1.5 报告菜单&#xff08;Report&#xff09;2.1.…

VIAVI唯亚威CellAdvisor 线缆和天线分析仪

CellAdvisor 线缆和天线分析仪利用一种基于云功能的轻便仪器中的射频/光功率计&#xff0c;提供了适用于行扫描测量和光纤检测的集成解决方案&#xff0c;以供在基站安装和维护期间使用。 CellAdvisor™ 线缆和天线分析仪 JD723C/JD724C/JD725C/JD726C 无线网络中的大多数问题…

诈金花的概率

游戏使用一副除去大小王的扑克牌&#xff0c;共4个花色52张牌。 1、豹子&#xff08;AAA最大&#xff0c;222最小&#xff09;。2、同花顺&#xff08;AKQ最大&#xff0c;A23最小&#xff09;。3、同花&#xff08;AKQ最大&#xff0c;352最小&#xff09;。4、顺子&#xff…

仿Mybatis手写持久层框架

文章目录一、持久层框架分析1. JDBC操作数据库_问题分析2. JDBC问题分析&解决思路&#xff08;1&#xff09;加载驱动&#xff0c;获取链接&#xff08;2&#xff09;定义sql、设置参数、执行查询&#xff08;3&#xff09;遍历查询结果集3. 自定义持久层框架_思路分析二、…

黑马《数据结构与算法2023版》正式发布

有人的地方就有江湖。 在“程序开发”的江湖之中&#xff0c;各种技术流派风起云涌&#xff0c;变幻莫测&#xff0c;每一位IT侠客&#xff0c;对“技术秘籍”的追求和探索也从未停止过。 要论开发技术哪家强&#xff0c;可谓众说纷纭。但长久以来&#xff0c;确有一技&#…

Feign、Ribbon、Hystrix

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;Feign、Ribbon、Hystrix ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在…

TensorFlow-Keras - FM、WideAndDeep、DeepFM、DeepFwFM、DeepFmFM 理论与实战

目录 一.引言 二.浅层模型概述 1.LR 2.FM 3.FMM 4.FwFM 5.FmFM 三.常用推荐算法实现 Pre.数据准备 1.FM 2.WideAndDeep 3.DeepFM 4.DeepFwFM 5.DeepFmFM 四.总结 1.函数测试 2.函数效果与复杂度对比[来自FmFM论文] 3.More 一.引言 推荐系统中常见的 CTR 模型…

ONLYOFFICE中的chatGPT 是如何编写毕业论文以及翻译多种语言的

前言 chatGPT这款软件曾被多个国家的大学禁用&#xff0c;我们也多次在网上看到chatGPT帮助应届毕业生编写毕业答辩论文&#xff0c;但是这款软件目前还没有在国内正式上线&#xff0c;ONLYOFFICE7.3版本更新后呢&#xff0c;就添加了chatGPT该功能&#xff0c;并且正常使用。 …

springboot+vue.js学生作业管理系统idea java

由于学校教学功能的特殊定位&#xff0c;致使教师和学生必须在除了简单的师生区别外&#xff0c;还有合作意味的关系。学生上交作业和老师批改作业&#xff0c;这本身除了学习交流外&#xff0c;还是一个合作的范畴。所以&#xff0c;这其中的信息管理流程&#xff0c;需要以一…

SpringBoot中获取wav音频文件的属性

前言 wav文件定义 WAV 文件是以 WAVE 格式保存的音频文件&#xff0c;这是一种用于存储波形数据的标准数字音频文件格式。WAV 文件可能包含具有不同采样率和比特率的音频记录&#xff0c;但通常以 44.1 kHz、16 位、立体声格式保存&#xff0c;这是用于 CD 音频的标准格式。 …

在React项目中引入字体文件并使用

一、背景 设计稿里某些文字所用的字体&#xff0c;系统默认不支持。 比如设计需要的这个字体&#xff1a;EmerlandRegular&#xff0c;即使在css里将文字字体设置为他们&#xff0c;实际效果也显示不出来。 二、现象及原因 1、样式 2、期待效果 3、实际效果 实际上是因为这个…

java设计模式之装饰器设计模式

介绍 装饰器设计模式是一种结构型设计模式&#xff0c;它允许动态地将行为添加到对象中&#xff0c;而无需在对象的类中使用子类化。它允许您通过将对象封装在一个具有新行为的对象中来动态地修改对象的行为。 这种模式是基于组合的思想&#xff0c;而不是继承。 可动态地将责…

CFS三层内网渗透

目录 环境搭建 拿ubuntu主机 信息收集 thinkphp漏洞利用 上线msf 添加路由建立socks代理 bagecms漏洞利用 拿下centos主机 msf上线centos 添加路由&#xff0c;建立socks代理 拿下win7主机 环境搭建 设置三块虚拟网卡 开启虚拟机验证&#xff0c;确保所处网段正确&a…

展会邀约 | 昂视与您相约BTF第12届上海锂电展

BTF第12届上海国际新能源锂电展将于3月7日在上海新国际博览中心举办。此次展会以“锂想动力&#xff0c;共创未来”为主题&#xff0c;汇聚行业内一众翘楚企业与专业观众&#xff0c;为各位展商以及观众提供专业的锂电交流平台&#xff0c;了解与碰撞新产品、新技术与解决方案&…

APISIX网关系列之Dashboard配置路由(二)

APISIX网关系列之Dashboard配置路由(二) 1.概述 APISIX作为系列介绍&#xff0c;将它所有的功能按照职责划分输出到每篇文章中。 上篇文章作为系列的开篇文章对APISIX进行了分析和安装介绍&#xff0c;查看详情地址&#xff1a;https://blog.csdn.net/m0_38039437/article/de…

【经典数据结构OJ讲解】你知道如何用两个队列实现一个栈,如何用两个栈实现一个队列吗?

目录 0.前言 1.回顾什么是队列和栈 2.如何用两个队列实现一个栈 2.1思路讲解 2.2按照思路实现仿生栈的各接口 2.2.1栈的初始化 2.2.2栈的销毁 2.2.3栈的插入 2.2.4栈的删除 2.2.5 栈的栈顶数据 2.2.6 判断当前栈是否为空 3.如何用两个栈实现一个队列 3.1 思路分析…

梯度下降优化器:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam -> AdamW

目录 1 前言 2 梯度概念 3 一般梯度下降法 4 BGD 5 SGD 6 MBGD 7 Momentum 8 SGDM&#xff08;SGD with momentum&#xff09; 9 NAG(Nesterov Accelerated Gradient) 10 AdaGrad 11 RMSProp 12 Adadelta 13 Adam 13 Nadam 14 AdamW 15 Lion&#xff08;EvoLve…