每日一题——最少移动次数使数组元素相等 II

简介: 每日一题——最少移动次数使数组元素相等 II

462. 最少移动次数使数组元素相等 II

题目描述:

给你一个长度为 n 的整数数组 nums ,返回使所有数组元素相等需要的最少移动数。

在一步操作中,你可以使数组中的一个元素加1或者减1。

示例1:

输入:nums = [1,2,3]

输出:2

解释:

只需要两步操作(每步操作指南使一个元素加 1 或减 1):

[1,2,3] => [2,2,3] => [2,2,2]

示例2:

输入:nums = [1,10,2,9]

输出:16

思路:

使用中位数即最优策略:

为了方便,我们先假设一共有2n+1个数,它们从小到大排序之后如下:

[ . . . m . . .]

此时m为中位数,左右各n个数,我们假设左边所有数变成m需要的代价是x,右边所有数变成m需要的代价是y

如果你感觉中位数不是最优策略:

我们来看看将所有数变成< m的某个数需要的代价,我们假设都变成m-a (a>0) , 由于之前让m右侧变成m代价为y,所以右侧变成m-a需要的代价是y+(m-(m-a))·n = y+a·n ,同理,左侧变成m-a需要的代价是x-(m-(m-a))·n = x-a·n,但是别忘记了,m也是要变成m-a的,代价是m-(m-a) = a,所以总代价是x+y+a,是大于x+y的;

同理,我们看看将所有数变成>m的某个数的代价,我们假设都变成m+a (a>0),同上,可以得出,总代价是x+y+a,也是大于x+y的。

同理,推广到2n的情况,依旧如此,所以至此,证明了中位数是最优策略

题解:

func minMoves2(nums []int) int {
  sort.Ints(nums)
  mid := nums[len(nums)/2]
  count := 0
  for i := 0; i < len(nums); i++ {
    if nums[i] > mid {
      count = nums[i] - mid + count
    } else {
      count = mid - nums[i] + count
    }
  }
  return count
}

提交结果:

相关文章
|
Java
java枚举的使用
java枚举的使用
85 0
|
Java 编译器
解析用GraalVm编译的class文件
这篇文章介绍了如何使用`javap`工具反编译由GraalVM编译的`.class`文件,详细展示了`javap`的用法和输出内容,包括类声明、版本信息、访问标志、类层次结构、接口、字段、方法、属性以及常量池等信息。
142 0
解析用GraalVm编译的class文件
|
存储 物联网 计算机视觉
|
监控 数据可视化 数据挖掘
常用地项目管理工具
常用地项目管理工具
125 5
|
开发框架 .NET API
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
144 0
|
机器学习/深度学习 弹性计算 负载均衡
购买阿里云服务器价格参考,活动价2000元左右的阿里云服务器分享
购买阿里云服务器需要多少钱,如果你计划购买一台价格在2000元左右的阿里云服务器,目前活动价格在2000元左右的阿里云服务器大概有16台,月付最低只要1814.00元可购买一台通用算力型u1实例8核32G配置的云服务器1个月,年付则可买到2核2G、2核4G和2核8G配置,如果购买其他系列的云服务器,最长可以买到计算型c8y实例1核2G配置云服务器3年,最低价格只要2147.76元。下面是2023年截至目前,活动价格在2000元左右的阿里云服务器分享。
398 0
购买阿里云服务器价格参考,活动价2000元左右的阿里云服务器分享
|
Windows
windows计划任务所遇到的闪退、触发器没有按时执行的坑
1、如图:在设置执行程序或脚本时,请一定要给起始于这个bat脚本的目录路径,否则会遇到执行计划任务闪退,对于网上给的尾行加pause也是心很累。
863 0
windows计划任务所遇到的闪退、触发器没有按时执行的坑
|
Python
【代码】利用Python每天自动发新闻到邮箱
【代码】利用Python每天自动发新闻到邮箱
98 0
|
Java API Spring
反射:替对象执行方法
反射:替对象执行方法
218 0
反射:替对象执行方法
|
前端开发 Java 程序员
如何在SpringBoot中优雅地重试调用第三方API?
如何在SpringBoot中优雅地重试调用第三方API?
462 0