文章目录
- 一【题目类别】
- 二【题目难度】
- 三【题目编号】
- 四【题目描述】
- 五【题目示例】
- 六【解题思路】
- 七【题目提示】
- 八【时间频度】
- 九【代码实现】
- 十【提交结果】
一【题目类别】
- 排序
二【题目难度】
- 中等
三【题目编号】
- 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 = = n u m s . l e n g t h n == nums.length n==nums.length
- 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
- − 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 −109<=nums[i]<=109
八【时间频度】
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),其中 n n n为数组的长度
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
package Sort;
import java.util.Arrays;
/**
* @Author: IronmanJay
* @Description: 462.最小操作次数使数组元素相等 II
* @CreateTime: 2022-11-17 09:29
*/
public class p462_MinimumMovesToEqualArrayElementsII {
public static void main(String[] args) {
int[] nums = {1, 2, 3};
int res = minMoves2(nums);
System.out.println("res = " + res);
}
public static int minMoves2(int[] nums) {
Arrays.sort(nums);
int len = nums.length;
int mid = nums[len / 2];
int res = 0;
for (int i = 0; i < len; i++) {
res += Math.abs(nums[i] - mid);
}
return res;
}
}
- C语言版
#include<stdio.h>
int compare_p462_MinimumMovesToEqualArrayElementsII(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int minMoves2(int* nums, int numsSize)
{
qsort(nums, numsSize, sizeof(int), compare_p462_MinimumMovesToEqualArrayElementsII);
int mid = nums[numsSize / 2];
int res = 0;
for (int i = 0; i < numsSize; i++)
{
res += fabs(nums[i] - mid);
}
return res;
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版