​LeetCode解法汇总2208. 将数组和减半的最少操作次数

news/2024/7/3 1:35:55

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作)

请你返回将 nums 数组和 至少 减少一半的 最少 操作数。

示例 1:

输入:nums = [5,19,8,1]
输出:3
解释:初始 nums 的和为 5 + 19 + 8 + 1 = 33 。
以下是将数组和减少至少一半的一种方法:
选择数字 19 并减小为 9.5 。
选择数字 9.5 并减小为 4.75 。
选择数字 8 并减小为 4 。
最终数组为 [5, 4.75, 4, 1] ,和为 5 + 4.75 + 4 + 1 = 14.75 。
nums 的和减小了 33 - 14.75 = 18.25 ,减小的部分超过了初始数组和的一半,18.25 >= 33/2 = 16.5 。
我们需要 3 个操作实现题目要求,所以返回 3 。
可以证明,无法通过少于 3 个操作使数组和减少至少一半。

示例 2:

输入:nums = [3,8,20]
输出:3
解释:初始 nums 的和为 3 + 8 + 20 = 31 。
以下是将数组和减少至少一半的一种方法:
选择数字 20 并减小为 10 。
选择数字 10 并减小为 5 。
选择数字 3 并减小为 1.5 。
最终数组为 [1.5, 8, 5] ,和为 1.5 + 8 + 5 = 14.5 。
nums 的和减小了 31 - 14.5 = 16.5 ,减小的部分超过了初始数组和的一半, 16.5 >= 31/2 = 16.5 。
我们需要 3 个操作实现题目要求,所以返回 3 。
可以证明,无法通过少于 3 个操作使数组和减少至少一半。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 107

解题思路:

* 2208. 将数组和减半的最少操作次数

* 解题思路:

* 最简单的思路,一定是每次排序取最大值,然后把最大值减半,减半后的值再加入集合进行排序重新取最大值,

* 所以插入集合的时候,如果使用lng的方法,那么时间复杂度就是n*lng,就是可满足的。

代码:

class Solution2208
{
public:
    int halveArray(vector<int> &nums)
    {
        multiset<double> mySet;
        double sum = 0.0;
        for (int i = 0; i < nums.size(); i++)
        {
            sum += nums[i];
            mySet.insert(nums[i] * 1.0);
        }
        int times = 0;
        double currentSum = 0;
        while (currentSum < sum / 2)
        {
            auto lastElement = mySet.rbegin();
            double value = (*lastElement) / 2.0;
            currentSum += value;
            mySet.erase(std::prev(lastElement.base()));
            mySet.insert(value);
            times++;
        }
        return times;
    }
};


http://lihuaxi.xjx100.cn/news/1375202.html

相关文章

Linux进程概念(续)

引入 我们先来看一段代码 #include<stdio.h> #include <unistd.h>int g_val200;//全局变量 int main() {int resfork();if(res>0)//father{printf("我是父进程。我的全局变量 g_val%d,他的地址是 %p\n",g_val,&g_val);}else if(res0)//子进程{g…

servicemanager的启动流程

servicemanager进程的入口 在frameworks/native/cmds/servicemanager/Android.bp文件中 cc_binary {name: "servicemanager",defaults: ["servicemanager_defaults"],init_rc: ["servicemanager.rc"],srcs: ["main.cpp"], }cc_binar…

五,Eureka 第五章

5.3.2 修改pom添加依赖 <dependencies><!--公共部门--><dependency><groupId>cn.bdqn</groupId><artifactId>springcloud-api-commons</artifactId><version>${project.version}</version></dependency><!--e…

java中的动态代理机制

目录 什么是动态代理&#xff1f; 为什么需要代理&#xff1f; 代理长什么样子&#xff1f; 代码样例 什么是动态代理&#xff1f; 动态代理可以无侵入式的给代码增加功能 为什么需要代理&#xff1f; 对象如果嫌弃身上的事情太多&#xff0c;就可以通过代理来转移部分的…

解决Cannot resolve plugin org.apache.maven.plugins:xxxxxxxx

解决Cannot resolve plugin org.apache.maven.plugins:xxxxxxxx 方法一、检查配置设置 下图中三个方框圈出来的地方设置为自己的下载的maven地址&#xff0c;配置文件地址&#xff0c;仓库地址。刷新maven。 我个人试过没用&#xff0c;不过网上有的朋友用这个方法解决了。 …

c++解析 一行字符串输入、 java大整数模板

nums [1,3,-1,-3,5,3,6,7], k 3将上述输入转换为c的输入 vector<int> split(const string& str, char sep) {vector<int> tokens;int i;stringstream ss(str);while (ss >> i) {tokens.push_back(i);if (ss.peek() sep) {ss.ignore();}}return tokens…

ROS noetic,ROS melodic 安装 MoveIt 并运行

ROS noetic&#xff0c;ROS melodic 安装 MoveIt 并运行 前言更新功能包版本下载依赖文件创建工作区和软件源下载源代码安装编译器缓存&#xff08;可选环节&#xff09;编译Moveit&#xff01;安装Moveit&#xff01;检测是否安装成功 前言 在安装过程中我也碰壁过很多次&…

RecyclerView 一次性加载大量数据时(2000条音频数据),导致UI线程卡顿,频繁GC的问题

问题描述&#xff1a; 公司项目有这么一个需求&#xff0c;扫描sdCard或U盘的音频数据&#xff0c;并分类展示出来&#xff0c;当数据量比较大时&#xff08;2000多条数据以上&#xff09;&#xff0c;显示列表慢和滑动列表会很卡。 问题的寻找过程&#xff1a; 当时想的就是…