把重复的部分去掉,sort,挨个数字遍历,计算出来以这个数字为开始,所需要的结尾数字,也就是n + N - 1,并查看原来的array中有没有这个数字,有,则只用改总数N - 这个数所在位置到被遍历到的位置的数 + 1.而如果没有,则修改N - 这个数所在位置到被遍历到的位置的数,因为结尾数字也需要修改。
注意查找end数字是否存在,保留数字的set而不是在sorted的list中寻找,速度更快。
class Solution:
def minOperations(self, nums: List[int]) -> int:
N = len(nums)
num_new = set(nums)
newlist = sorted(list(num_new))
res = float('inf')
for i,n in enumerate(newlist):
validend = n + N - 1
pos = bisect.bisect_left(newlist, validend)
if validend in num_new:
res = min(res, N - (pos - i+1))
else:
res = min(res, N - (pos - i))
return res