力扣第462题 最小操作次数使数组元素相等 II C++ 排序基础 附Java代码
题目
中等
相关标签
给你一个长度为 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
思路和解题方法
// 计算使数组所有元素相等所需的最小移动次数
:这是对 minMoves2 函数功能的简要描述。
sort(nums.begin(),nums.end());
:使用 C++ 的标准库函数 sort 对数组 nums 进行升序排序。
int n = nums.size();
:获取数组 nums 的长度,即元素个数。
int ans = 0, x= nums[n/2];
:初始化结果变量 ans 为 0,并取中位数作为目标值 x。这里利用了数组已经排序过的特性,直接取排序后的中间值作为目标值。
for(int i = 0;i<n;i++)
:遍历数组 nums,对每个元素进行处理。
ans +=abs(nums[i] - x);
:累加每个元素与目标值 x 的差的绝对值到结果变量 ans 中。这里通过计算每个元素与目标值的差的绝对值来累加移动次数,因为我们的目标是让所有元素相等,所以需要将每个元素移动到目标值 x 所需的步数。
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++ 代码
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代码
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;
}
}
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)