力扣第462题 最小操作次数使数组元素相等 II C++ 排序基础 附Java代码

题目

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.length
  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

思路和解题方法

  1. // 计算使数组所有元素相等所需的最小移动次数:这是对 minMoves2 函数功能的简要描述。

  2. sort(nums.begin(),nums.end());:使用 C++ 的标准库函数 sort 对数组 nums 进行升序排序。

  3. int n = nums.size();:获取数组 nums 的长度,即元素个数。

  4. int ans = 0, x= nums[n/2];:初始化结果变量 ans 为 0,并取中位数作为目标值 x。这里利用了数组已经排序过的特性,直接取排序后的中间值作为目标值。

  5. for(int i = 0;i<n;i++):遍历数组 nums,对每个元素进行处理。

  6. ans +=abs(nums[i] - x);:累加每个元素与目标值 x 的差的绝对值到结果变量 ans 中。这里通过计算每个元素与目标值的差的绝对值来累加移动次数,因为我们的目标是让所有元素相等,所以需要将每个元素移动到目标值 x 所需的步数。

  7. return ans;:将累加结果 ans 作为最小移动次数返回。

复杂度

时间复杂度:

O(n * logn)

时间复杂度为O(n log n),其中n是输入数组nums的长度。这是因为在代码中使用了sort函数对数组进行排序,其时间复杂度为O(n log n)。接下来的for循环需要线性时间O(n)来遍历整个数组,因此整体的时间复杂度为O(n log n + n),即O(n log n)。

空间复杂度

O(1)

空间复杂度则为O(1),因为除了输入数组之外,代码中并没有使用额外的辅助空间,所以空间复杂度是常数级的,为O(1)。

c++ 代码

cpp 复制代码
class Solution {
public:
    // 计算使数组所有元素相等所需的最小移动次数
    int minMoves2(vector<int>& nums) {
        // 对数组进行排序
        sort(nums.begin(),nums.end());
        // 获取数组长度
        int n = nums.size();
        // 初始化结果变量为0,并取中位数作为目标值
        int ans = 0, x= nums[n/2];
        // 遍历数组,累加每个元素与目标值的差的绝对值
        for(int i = 0;i<n;i++)
        {
            ans +=abs(nums[i] - x);
        }
        // 返回累加结果作为最小移动次数
        return ans;
    }
};

Java代码

java 复制代码
class Solution {
    // 计算使数组所有元素相等所需的最小移动次数
    public int minMoves2(int[] nums) {
        // 对数组进行排序
        Arrays.sort(nums);
        // 获取数组长度
        int n = nums.length;
        // 初始化结果变量为0,并取中位数作为目标值
        int ret = 0, x = nums[n / 2];
        // 遍历数组,累加每个元素与目标值的差的绝对值
        for (int i = 0; i < n; i++) {
            ret += Math.abs(nums[i] - x);
        }
        // 返回累加结果作为最小移动次数
        return ret;
    }
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦 >人< 。

相关推荐
gugugu.41 分钟前
数据结构:AVL树
数据结构
大三觉醒push亡羊补牢女娲补天版44 分钟前
数据结构之树(4)
数据结构
T0uken1 小时前
【QT Quick】C++交互:与QML类型转换
c++·qt·交互
程序猿阿伟2 小时前
《C++音频降噪秘籍:让声音纯净如初》
开发语言·c++·网络协议
极客小张2 小时前
基于STM32的智能家居语音控制系统:集成LD3320、ESP8266设计流程
c语言·stm32·物联网·算法·毕业设计·课程设计·语言识别
Tech_gis2 小时前
C++ 观察者模式
开发语言·c++·观察者模式
曳渔2 小时前
Java-数据结构-反射、枚举 |ू・ω・` )
java·开发语言·数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂3 小时前
算法与程序课程设计——观光铁路
c语言·c++·算法·课程设计·dijkstra 算法·spfa算法
忘梓.3 小时前
C嘎嘎入门篇:类和对象番外(时间类)
c++·算法
bbqz0073 小时前
逆向WeChat(七)
数据库·c++·微信·逆向·protobuf·sqlcipher·破解密钥·解码protobuf·wechatdb