209. Minimum Size Subarray Sum

๊ฐœ๊ตดยท2024๋…„ 6์›” 10์ผ

leetcode

๋ชฉ๋ก ๋ณด๊ธฐ
25/51
  • python3

๐Ÿ“Ž Problem

Given an array of positive integers nums and a positive integer target, return the minimal length of a subarray whose sum is greater than or equal to target. If there is no such subarray, return 0 instead.

Example 1:

Input: target = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: The subarray [4,3] has the minimal length under the problem constraint.

Example 2:

Input: target = 4, nums = [1,4,4]
Output: 1

Example 3:

Input: target = 11, nums = [1,1,1,1,1,1,1,1]
Output: 0

Constraints:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 104

Follow up: If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log(n)).

Pseudocode

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๊ธฐ๋ฒ•

๋ฐฐ์—ด์˜ ํŠน์ • ๊ตฌ๊ฐ„์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ทธ ๊ตฌ๊ฐ„์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ด ๋ฌธ์ œ์—์„œ๋Š” ์œˆ๋„์šฐ์˜ ํ•ฉ์ด target ์ด์ƒ์ด ๋  ๋•Œ๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ ๋์„ ํ™•์žฅํ•˜๊ณ , ๊ทธ ์ดํ›„์— ์™ผ์ชฝ ๋์„ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ์ตœ์†Œ ๊ธธ์ด๋ฅผ ์ฐพ๋Š”๋‹ค.

์ ˆ์ฐจ

  1. ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”:
    left: ์œˆ๋„์šฐ์˜ ์™ผ์ชฝ ๋์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ.
    sum: ํ˜„์žฌ ์œˆ๋„์šฐ ๋‚ด์˜ ์š”์†Œ๋“ค์˜ ํ•ฉ.
    min_length: ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ์ตœ์†Œ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜. ์ฒ˜์Œ์—๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’์ธ float('inf')๋กœ ์ดˆ๊ธฐํ™”.

  2. ์˜ค๋ฅธ์ชฝ ๋ ํ™•์žฅ:
    ๋ฐฐ์—ด nums๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์š”์†Œ๋ฅผ sum์— ๋”ํ•œ๋‹ค.
    sum์ด target ์ด์ƒ์ด ๋˜๋ฉด ์œˆ๋„์šฐ์˜ ์™ผ์ชฝ ๋์„ ์ค„์—ฌ๊ฐ€๋ฉด์„œ min_length๋ฅผ ์—…๋ฐ์ดํŠธ.

  3. ์™ผ์ชฝ ๋ ์ถ•์†Œ:
    sum์ด target ์ด์ƒ์ธ ๋™์•ˆ, ์™ผ์ชฝ ๋(left)์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด์„œ sum์—์„œ nums[left]๋ฅผ ๋นผ๊ณ , ์œˆ๋„์šฐ์˜ ๊ธธ์ด๋ฅผ ์ค„์ธ๋‹ค.
    ๊ทธ ๊ณผ์ •์—์„œ min_length๋ฅผ ์—…๋ฐ์ดํŠธ.

  4. ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜:
    ๋งŒ์•ฝ min_length๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด(์—ฌ์ „ํžˆ float('inf')๋ผ๋ฉด) ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ 0์„ ๋ฐ˜ํ™˜.
    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด min_length๋ฅผ ๋ฐ˜ํ™˜.

Code

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left = 0
        sum = 0
        min_length = float('inf')
        
        for right in range(len(nums)):
            sum += nums[right]
            
            while sum >= target:
                min_length = min(min_length, right - left + 1)
                sum -= nums[left]
                left += 1
        
        return 0 if min_length == float('inf') else min_length

Result

  • Time Complexity : O(n)
  • Space Complexity : O(1)
profile
์•Œ์ญ๋‹ฌ์ญํ˜€์š”

0๊ฐœ์˜ ๋Œ“๊ธ€