DLOS AI OPERATING SYSTEM: 面向企业级AI系统软件的完整技术架构与实现方案
2026/6/8 12:49:38
这道题乍一看有点反直觉。
题目说的是:
每次操作让n - 1 个元素加 1
很多人第一反应是:
但实际上,这道题一旦你换一个视角,就会发现答案非常简单,甚至可以一行代码解决。
核心在于一句话:
“给 n - 1 个数加 1,本质上等价于给 1 个数减 1。”
只要想通这一点,这题基本就结束了。
题目给你一个整数数组nums,长度是n。
规则是:
nums = [1,2,3]可以这样操作:
[1,2,3] -> [2,3,3] -> [3,4,3] -> [4,4,4]答案是3。
最小操作次数 = 所有元素与最小值的差之和
公式表示就是:
sum(nums) - min(nums) * n关键在于等价变换。
n - 1个数+1+1-1整体结果没变。
也就是说:
每次操作,相当于选择一个元素,让它 -1
变成了:
每次可以让某一个数减 1
要把所有数都变成同一个值(而且操作次数最少)
那目标值选谁最合理?
答案是:数组中的最小值。
classSolution{funcminMoves(_nums:[Int])->Int{guardletminValue=nums.min()else{return0}varresult=0fornuminnums{result+=num-minValue}returnresult}}guardletminValue=nums.min()else{return0}这是整个算法的“锚点”。
我们最终的目标是:
minValueresult+=num-minValue含义非常直观:
numminValue1,就相当于一次操作num - minValue次因为:
letsolution=Solution()print(solution.minMoves([1,2,3]))输出:
3解释:
(1 - 1) + (2 - 1) + (3 - 1) = 0 + 1 + 2 = 3print(solution.minMoves([1,1,1]))输出:
0所有元素已经相等,不需要操作。
print(solution.minMoves([-1,0,2]))计算过程:
min = -1 (-1 - -1) + (0 - -1) + (2 - -1) = 0 + 1 + 3 = 4这道题在真实开发中,其实很常见,比如:
你有一组数:
这时就可以反向思考:
比如:
那从另一个角度看:
这题非常适合考:
O(n)O(n)总时间复杂度:
O(n)空间复杂度:
O(1)LeetCode 453 是一道非常典型的:
只要你记住这句话:
“给 n - 1 个数加 1,等价于给 1 个数减 1。”
这道题基本就是秒解。