알고리즘

[Python] LeetCode 209. Minimum Size Subarray Sum

공부하는묵 2025. 3. 18. 23:49

https://leetcode.com/problems/minimum-size-subarray-sum/description/

  • 자연수를 담고 있는 리스트 nums와 목표 자연수 target이 주어진다
  • nums의 subarray 중, subarray 내의 모든 원소의 합이 target 이상이면서 길이가 가장 짧은 subarray의 길이를 구하는 문제

아이디어

1. subarray의 시작 지점이 고정이라면, subarray의 합을 늘리기 위해 끝 지점을 늘려가면서 탐색할 수 있음

2. subarray의 끝 지점을 늘려가다 합이 target 보다 같거나 커지면 더 이상 subarray를 늘려볼 필요가 없음

3. subarray의 합을 줄이기 위해서는 시작 지점을 늘린다

-> 기본적인 two-pointer 흐름이니까 기억해둘 것

 

two-pointer를 이용한 부분합을 구할 때는, 배열의 첫 부분과 마지막 부분만 업데이트

그렇기 때문에 업데이트 되는 원소 값만 더하거나 빼줘야 더 빠르게 부분합을 빠르게 업데이트 할 수 있다

-> sliding window

 

시간복잡도는 O(n)

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        if sum(nums) < target:
            return 0
		# subarray의 처음과 끝 index
        start, end = 0, 0
        answer = len(nums)
        total_sum = nums[0]
        while start <= end:
        	# subarray의 합 검사
            # target 보다 크다면, start를 늘려서 subarray를 줄이기
            if total_sum >= target:
                answer = min(answer, end - start + 1)
                total_sum -= nums[start]
                start += 1
                if start == len(nums):
                    break
            # target 보다 작다면, end를 늘려서 subarray를 늘리기
            else:
                end += 1
                if end == len(nums):
                    break
                total_sum += nums[end]

        return answer