当前位置: 首页 > news >正文

462. 最小操作次数使数组元素相等 II——【Leetcode每日一题】

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

提示:

  • n==nums.lengthn == nums.lengthn==nums.length
  • 1<=nums.length<=1051 <= nums.length <= 10^51<=nums.length<=105
  • −109<=nums[i]<=109- 10^9 <= nums[i] <= 10^9109<=nums[i]<=109

思路:

每次可以对一个数组元素加一或者减一,求最小的改变次数。

这是个典型的相遇问题,移动距离最小的方式是所有元素都移动到中位数。理由如下:

  • m中位数abm 两边的两个元素,且 b > a
  • 要使 ab 相等,它们总共移动的次数为 b - a,这个值等于 (b - m) + (m - a)
  • 也就是把这两个数移动到中位数的移动次数

设数组长度为 N,则可以找到 N/2ab 的组合,使它们都移动到 m 的位置。

代码:(Java、C++)

Java

import java.util.Arrays;public class MinMoves2 {public static void main(String[] args) {// TODO Auto-generated method stubint[] nums = {1, 10, 2, 9};System.out.println(minMoves2(nums));}public static int minMoves2(int[] nums) {Arrays.sort(nums);int l = 0, h = nums.length - 1;int moves = 0;while(l < h) {moves += nums[h--] - nums[l++];}return moves;}
}

C++

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;class MinMoves2 {
public:int minMoves2(vector<int>& nums) {sort(nums.begin(), nums.end());int l = 0, h = nums.size() - 1;int moves = 0;while (l < h) {moves += nums[h--] - nums[l++];}return moves;}
};int main() {MinMoves2 m;vector<int> nums = {1,10,2,9 };cout << m.minMoves2(nums) << endl;system("pause");return 0;
}

运行结果:

在这里插入图片描述

复杂度分析:

  • 时间复杂度O(nlogn)O(nlogn)O(nlogn),其中 n 是数组 nums 的长度。排序需要 O(nlog⁡n)O(nlog⁡n)O(nlogn)的时间。
  • 空间复杂度O(logn)O(logn)O(logn)。排序需要 O(log⁡n)O(log⁡n)O(logn)的递归栈空间。

题目来源:力扣。

注:仅供学习参考, 如有不足,欢迎指正!

http://www.lryc.cn/news/45346.html

相关文章:

  • 对数据库的库及表的操作
  • final类又没实现接口应该用哪一种代理, jdk动态代理还是cglib代理
  • 使用StaMPS_Visualizer
  • 高并发-高性能-高可用-结论版
  • 数智转型助力建筑业全产业链升级,你了解多少?
  • Python网络设备脚本中经常使用的connecthandler和telnetlib是什么意思?
  • 你真的会写 git commit message 吗?
  • ISO文件内添加kickstart完成自动安装
  • SpringBoot 整合RabbitMq 自定义消息监听容器来实现消息批量处理
  • jquery基础之操作节点对象
  • 对于Java的深入理解及其特点--面试
  • Linux GPSD的使用
  • ArrayList无参构造添加元素源码解读
  • 手写简易 Spring(二)
  • 排列问题DFS入门
  • 【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
  • 【07 Metadata and VendorTag】
  • Golang中Model的使用
  • 交友项目【基础环境搭建】
  • 入职时,公司要求自己带电脑,每月给100元补贴,如果不接受就不能入职!
  • 20道经典Redis面试题
  • 十分钟带你看懂接口测试,2023最全超大型接口测试攻略
  • 【设计模式】创建型-单例模式
  • Python 练习 六
  • 「SQL面试题库」 No_22 员工奖金
  • 瞒不住了,Prefetch 就是一个大谎言
  • 这个时候了,你还不会不知道JavaMail API吧
  • JavaScript var let区别
  • Thinkphp 6.0容器和依赖注入
  • Type javax.servlet.http.HttpServletRequest not present