Go语言解题LeetCode453:最小操作次数使数组元素相等

叶初
叶初
发布时间:2026-10-15 | 2人浏览过
原创

给定一个整数数组,每次操作可将 n - 1 个元素增加 1。求使所有元素相等的最小操作次数。核心思路是将加法操作转化为减法视角:最终答案等于所有元素减去数组最小值的累加和。Go语言实现采用单次遍历,效率极高。

题目描述与核心转化

LeetCode 453题要求计算最小操作次数,使得数组中所有元素相等。操作定义为:每次选择 n - 1 个元素,将它们各增加 1。

关键思维转换:

在相对高度不变的视角下,“让除了某个元素之外的其他所有元素都加1”,等价于“将该特定元素减1”。

因此,问题可以简化为:至少需要进行多少次“减1”操作,才能使所有元素变为数组中的最小值?

结论:

最小操作次数 = Σ(nums[i] - min(nums))

即:所有元素与最小值的差值之和。

示例分析:

  • 输入:[1, 2, 3]
  • 最小值为 1
  • 操作次数 = (1-1) + (2-1) + (3-1) = 0 + 1 + 2 = 3

Go语言代码实现

为了获得最优的时间复杂度 O(n) 和空间复杂度 O(1),我们可以在遍历数组的同时维护最小值和总差值。

第1步:初始化变量

设置 minVal 为最大整数值,ops 用于记录累计的操作次数(即差值之和)。

第2步:单次遍历计算

使用 for range 遍历切片。对于每个元素 num:

  1. 若当前元素小于已知最小值,更新最小值,并累加之前所有元素与新最小值的差值。
  2. 若当前元素大于等于最小值,仅累加它与当前最小值的差值。

注:更简洁且不易出错的写法是直接计算总和与最小值的关系:ops = sum(nums) - minVal * len(nums)。以下是符合该逻辑的高效Go实现:*

func minMoves(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	
	minVal := nums[0]
	sum := 0
	
	// 第一遍:找到最小值并计算总和
	for _, num := range nums {
		if num < minVal {
			minVal = num
		}
		sum += num
	}
	
	// 数学推导:总操作数 = 总和 - (最小值 * 元素个数)
	return sum - minVal * len(nums)
}

另一种双变量一次遍历实现(无溢出风险优化):

func minMoves(nums []int) int {
	minVal := 1 << 31 // int最大值近似处理,实际建议使用第一个元素初始化
	sum := 0
	
	for i, num := range nums {
		if num < minVal {
			// 发现新的最小值,之前累积的差值需要重新计算
			// 之前多算了部分差值,需进行调整
			sum += i * (minVal - num)
			minVal = num
		} else {
			sum += num - minVal
		}
	}
	return sum
}

总结

本题的关键在于跳出“增加元素”的思维定势,转而思考“减少元素”的相对运动。在Go语言中,利用循环一次遍历即可完成统计,避免了先排序 O(nlogn) 或多次遍历的低效做法。掌握这种数学转化思维,是解决此类算法题的核心技巧。

以上就是Go语言解题LeetCode453最小操作次数使数组元素相等的详细内容,更多关于Go语言算法题解的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表