📅  最后修改于: 2023-12-03 15:40:55.231000             🧑  作者: Mango
给定一个非递减的整数数组 nums
,你需要将这个数组中的每个元素替换成比该元素大的最小正整数,方法是用最小的可能的代价使得数组更改后变成一个递增数组。
返回最小代价。
由于需要用最小的代价实现替换,那我们肯定需要尽可能少的替换。所以我们可以考虑将数组中每个元素都替换成比它大的最小正整数,如果这个最小正整数比该元素大,那么就说明需要替换,替换的代价就是两者之差。
如果替换后该元素比新的元素要小,那么就说明该元素可以不替换,因为后面的元素比它大,不会受到它的影响。
class Solution:
def minOperations(self, nums: List[int]) -> int:
n = len(nums)
res = 0
for i in range(n):
if i == 0:
nums[i] = max(nums[i], 1)
else:
if nums[i] <= nums[i - 1]:
res += nums[i - 1] - nums[i] + 1
nums[i] = nums[i - 1] + 1
else:
nums[i] = max(nums[i], nums[i - 1] + 1)
return res
这个算法时间复杂度为 $O(n)$,因为只需要遍历一次数组即可。
这个算法空间复杂度为 $O(1)$,因为只用了常数个变量。