leetcode 2448. Minimum Cost to Make Array Equal(使数组相等的最小成本)

news2024/9/27 21:30:56

在这里插入图片描述

数组nums的元素每次可进行下面的操作:
每个元素+1 或者 -1。
操作一次的cost是cost[i].
问把nums的元素全部变为相等的元素需要的最小的cost.

思路:

nums的元素全部变为相等的元素,这个相等的元素是多少,现在不知道。
一旦知道了目标元素是多少,就可以直接计算cost.

所以需要求解的其实是这个相等的目标元素是多少。
它的可能性是 1 ~ 106 (nums[i]的范围),要在这个范围内找到一个数字,使cost最小。
那么需要用到binary search.

存在一个数字,nums所有元素在+1,-1的操作下变为这个数字的cost最小,
假设数字是a, 那么cost(a-1) > cost(a), cost(a+1) > cost(a),
在binary search中,如果cost(mid-1) > cost(mid), cost(mid+1) > cost(mid),
那么mid就是要找的目标数字。

如果cost(mid) > cost(mid-1), 说明要向左边去找,right=mid-1, 反之left = mid+1.

class Solution {
    public long minCost(int[] nums, int[] cost) {
        int left = 1;
        int right = 1000000;

        long res = Long.MAX_VALUE;

        //binary search
        while(left <= right) {
            int mid = left + (right-left)/2;
            long curCost = findCost(nums, cost, mid);
            res = Math.min(res, curCost);
            long rCost = findCost(nums, cost, mid+1);
            long lCost = findCost(nums, cost, mid-1);

            if(curCost < lCost && curCost < rCost) return res;
            else if(curCost > rCost) left = mid+1;
            else right = mid-1;
        }
        return res;
    }

    long findCost(int[] nums, int[] cost, int value){
        long res = 0;
        for(int i = 0; i < nums.length; i++) {
            long diff = Math.abs(nums[i] - value);
            res += diff * cost[i];
        }
        return res;
    }
}

或者直接先找目标数字,再求cost.
这个方法更快一些。
但是很神奇的是如果把mid=(left+right+1)/2换成mid=left+(right-left)/2就会TLE。

class Solution {
    public long minCost(int[] nums, int[] cost) {
        int left = 1;
        int right = 1000000;

        while(left < right){
            //mid = left+(right-left)/2会TLE
            int mid = (left + right +1)/2;
            long curCost = findCost(nums, cost, mid);
            long lCost = findCost(nums, cost, mid-1);

            if(curCost >= lCost) right = mid - 1;
            else left = mid;
        }
        return findCost(nums, cost, left);
    }

    long findCost(int[] nums, int[] cost, int val)
    {
        long ans = 0; 
        for(int i = 0; i< nums.length; i++)
        {
           ans += (long)Math.abs(nums[i]-val) * cost[i];
        }
        return ans;
    }
}

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

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

相关文章

Jmeter查看结果树之查看响应的13种方法

目录 前言&#xff1a; 1、Text 2、RegExpTester 3、BoundaryExtractorTester 4、CSSSelectorTester 5、XpathTester 6、JSONPathTester 7、HTML 8、HTMLSourceFormatted 9、HTML&#xff08;downloadresources&#xff09; 10、Document 11、JSON 12、XML 13、B…

RPA×IDP×AIGC,实在智能打造全新“超进化”文档审阅超自动化解决方案

企业商业活动频繁&#xff0c;每日都有大量文档被创建、书写、传递&#xff0c;需要人工审阅核查&#xff0c;以确保其准确性和合法性。这是对企业文档管理的一个巨大挑战&#xff0c;尤其对于金融机构、审计机构等文本相关岗位的工作人员来说更是如此。传统的文档审核通常需要…

集合和泛型的详细讲解

集合 1&#xff09;可以动态保存任意多个对象&#xff0c;使用比较方便&#xff01; 2&#xff09;提供了一系列方便的操作对象的方法&#xff1a;add、remove、set、get等3&#xff09;使用集合添加&#xff0c;删除新元素的示意代码&#xff0d;简洁了 集合的框架体系 …

实时检测Aruco标签坐标opencv-python之添加卡尔曼滤波

在实时检测Aruco标签坐标用于定位的时候发现&#xff0c;追踪效果不是很好&#xff0c;于是在检测过程中添加了卡尔曼滤波&#xff0c;在aruco检测算法检测不到aruco标签的时候&#xff0c;调用卡尔曼滤波算法&#xff08;KalmanFilter&#xff09;&#xff0c;补偿丢失的定位的…

Rabbitmq学习

文章目录 前言RabbitMQ 1 同步调用和异步调用2 常见的MQ对比3 安装RabbitMQ4 RabbitMQ学习4.1 helloworld学习 5 Spring AMQP5.1 AMQP的入门案例(使用rabbittemplate进行消息发送和接受)5.2 RabbitMQ的workquene5.3 发布订阅模型(exchange(广播fanout 路由direct 话题topic))5.…

RK3588 修改USB/Sata/TF挂载点

文章目录 概要整体架构流程技术名词解释技术细节小结APP概要 rk3588 android12 平台的挂载点是:/storage/设备卷名(即uuid) 对上层开发不太友好,因此需要固定某个挂载点提供上层app调用。 修改后的路径效果如下: 整体架构流程 从概要图示中可知:对每个挂载点创建软连接来…

大牛分享,提高工程性能的7个简单技巧

软件性能和弹性&#xff08;恢复能力&#xff09;是用户体验的关键组成部分&#xff0c;但随着软件行业采用DevOps&#xff0c;它开始在性能和弹性方面出现不足。在软件完全失败之前&#xff0c;性能问题经常被忽略。 但是&#xff0c;我们都知道性能不会突然降低。随着软件通…

【二叉树part02】| 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树

目录 ✿LeetCode102.二叉树的层序遍历❀ ✿LeetCode226.翻转二叉树❀ ✿LeetCode101.对称二叉树❀ ✿LeetCode102.二叉树的层序遍历❀ 链接&#xff1a;102.二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff…

Python入门(二十七)测试(二)

测试&#xff08;二&#xff09; 1.测试类2.各种断言方法3.一个要测试的类4.测试AnonymousSurvey类5.方法setUp() 1.测试类 前面我们编写了针对单个函数的测试&#xff0c;下面来编写针对类的测试。很多程序中都会用到类&#xff0c;因此证明我们的类能够正确工作大有裨益。如…

AI绘画——了解AI绘画爆火原因与工具,并生成几个端午绘画小作品

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.AI绘画 1.AI绘画爆火原因 2.AI绘画背后原理 二.AI绘画工具介绍 1.midjour…

IDC武连峰:应用数字安全免疫力理念,促进企业在数字时代韧性发展

作者&#xff1a;IDC中国副总裁、首席分析师 武连峰 数字安全免疫力是一个企业针对各种数字安全威胁时的防御机制&#xff0c;与人体免疫力相似&#xff0c;企业数字安全免疫力包含两类&#xff1a;企业安全文化意识与合规是先天性数字安全免疫力&#xff0c;今天任何一个企业…

vue使用swiper三行轮播问题

1、轮播图设置属性slidesPerColumn:3实现不了&#xff0c;解决方案如下&#xff1a; this.scheduleData是后台请求的数据&#xff0c;通过3个一组分组转换为this.scheduleListThreede 的数据&#xff01; 2、逻辑处理如下&#xff1a; computed: { scheduleListThree: functi…

做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

前言 作为一名测试工程师&#xff0c;工作中在对测试结果进行数据比对的时候&#xff0c;或多或少要和数据库打交道的&#xff0c;要和数据库打交道&#xff0c;那么一些常用的sql查询语法必须要掌握。最近有部分做测试小伙伴表示sql查询不太会&#xff0c;问我有没有sql查询语…

list赋值方法add()...和set()简介

目录 一、方法展示 二、add() 方法介绍 2.1.add&#xff08;E element&#xff09; 2.1.1源码 2.1.2.实例截图 2.1.3.Null引起的题外话 2.2.add(int index, E element) 2.2.1.源码 2.2.2.示例截图 2.2.3. add()引起IndexOutOfBoundsException简介 三、addAll()方法…

CSS查缺补漏之《媒体查询@media与BFC》

示例代码如下&#xff1a; <div class"box">世界你好</div> .box {width: 200px;height: 200px;background-color: yellow;color: white;font-size: 24px;text-align: center;line-height: 200px; } 媒体类型 媒体类型允许指定文件将如何在不同媒体上…

OpenCV——《图像平滑》结果输出对比《形态学操作》

1.图像平滑 图像平滑是一项简单且使用频率很高的图像处理方法&#xff0c;可以用来压制、弱化或消除图像中的细节、突变、边缘和噪声&#xff0c;最常见的是用来减少图像上的噪声。 常用的滤波器主要为&#xff1a; 均值滤波器&#xff1a;并不能完全消除噪声&#xff0c;只能…

【服务器】搭建hMailServer 服务实现远程发送邮件

typora-copy-images-to: upload hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工具即可实现远程发送邮件,不需要使用公网服务器,不需要域名,而且邮件账号名称可以自定义. 下面以windows 10系统为环境,介绍使用方法: 1. 安装hMailServe…

小鹏G9高压平台800V电驱动实拍

近日&#xff0c;小鹏汽车董事长何小鹏在其个人社交账号上透露&#xff0c;小鹏G9正按原定计划按部就班推进节奏&#xff0c;将于8月启动预订&#xff0c;9月正式迎来上市&#xff0c;上市后很快就会启动用户交付。 图片来源&#xff1a;何小鹏官方微博 需要样件请联&#xff1…

Oracle DMP文件导入

dmp文件可以在Navicat中的 把dmp放入其中。然后用数据泵导入。遗憾的是报错 [ERR] ORA-39001: invalid argument value [ERR] ORA-39000: bad dump file specification [ERR] ORA-39143: dump file "/xxx.DMP" may be an original export dump file 改为imp工具&…

干货分享 | TSMaster标定模块自动化控制应用指南

本文目录&#xff1a; 一、TSMaster标定模块自动化控制的基础原理 1.1 TSMaster的标定系统变量 1.2 内部TSMaster调用C脚本实现标定模块的自动化控制 1.3 外部调用COM组件实现自动化标定 二、标定自动化控制场景与TSMaster实例 2.1 C脚本实现控制标定模块的启动与关闭的设…