문제
https://leetcode.com/problems/smallest-missing-integer-greater-than-sequential-prefix-sum
풀이
정수 배열 nums가 주어진다. 배열의 첫 원소부터 연속해서 증가하는 부분의 합을 구한 뒤, 그 합보다 크거나 같으면서 배열에 존재하지 않는 가장 작은 정수를 찾으면 된다.
먼저 첫 번째 원소를 합에 더해두고, 현재 원소가 다음 조건을 만족하는지 확인한다.
$$ nums[i] = nums[i - 1] + 1 $$
조건을 만족하는 동안에는 현재 원소를 합에 더하고, 연속 조건이 깨지면 순회를 종료한다.
이제 구한 합을 후보값으로 두고, 후보값이 배열 안에 있으면 1씩 증가시킨다. 배열에 없는 첫 번째 값이 정답이다. 이 부분은 코드처럼 배열에 후보값이 존재하는 동안 반복하면 된다.
연속 부분을 확인하는 데 $O(n)$이 걸린다. 현재 구현은 후보값을 배열에서 직접 검색하므로 최악의 시간 복잡도는 $O(n^2)$이다.
코드
class Solution:
def missingInteger(self, nums: List[int]) -> int:
answer = nums[0]
for idx in range(1, len(nums)):
if nums[idx - 1] + 1 == nums[idx]:
answer += nums[idx]
else:
break
while answer in nums:
answer += 1
return answer