class Solution:
def minPatches(self, nums: List[int], n: int) -> int:
ans, total, idx = 0, 0, 0
while total < n:
if idx < len(nums):
if total < nums[idx] - 1:
total = total * 2 + 1
ans += 1
else:
total += nums[idx]
idx += 1
else:
total = total * 2 + 1
ans += 1
return ans
전제
m
까지의 숫자를 만들 수 있다고 한다면 2 * m + 1
까지의 숫자를 만들때 필요한 숫자는 하나이다.m
까지의 숫자를 만들 수 있지만 m
보다 작은 k
라는 숫자를 하나 더 가지게 되면 m + k
까지의 숫자를 만들 수 있게 된다. 해설
total
은 만들 수 있는 최대 값을 저장합니다. idx
로 진행하면서 각 숫자를 total
에 더하면서 진행 합니다. 숫자를 더할 필요가 있을 때 ans
에 숫자를 더하여 줍니다.idx > len(nums)
인 상황에서는 계속 해서 새로운 숫자를 만들어 주어야 합니다.idx < len(nums)
인 상황에서는 일단 total
에 만들 수 있는 최대 값을 저장합니다.total
과 nums[idx]-1
을 비교하여 total
이 크거나 같은 경우는 이미 nums[idx]
보다 크거나 같은 값을 만들 수 있기 때문에 total
을 total+ nums[idx]
로 재조종하고 다음 idx
로 넘어갑니다.total
과 nums[idx]-1
을 비교하여 total
이 작은 경우는 숫자를 더 필요로 하기 때문에 숫자를 하나 더 만들고 total
을 total * 2 + 1
로 재조정하고 ans
도 1 더 해줍니다. 정확히 필요한 숫자는 total+1
입니다. (하지만 문제를 풀때는 필요가 없습니다.)total
이 n
보다 크거나 같을 때까지 반복하면 됩니다.