반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- javascript
- LeetCode
- 파이썬
- 프로그래밍
- CS
- react
- VUE
- dp
- Level1
- OS
- C++
- 리액트
- Level2
- python
- 카카오
- 자바스크립트
- Level3
- web
- 프로그래머스
- Medium
- 배열
- sql
- typescript
- 동적계획법
- Doitvue.js입문
- 백준
- 웹프로그래밍
- 리트코드
- 고득점Kit
- 코테연습
Archives
- Today
- Total
[리트코드] 209. Minimum Size Subarray Sum 본문
반응형
209. Minimum Size Subarray Sum
문제
Given an array of positive integers nums and a positive integer target, return the minimal length of a contiguous subarray [numsl, numsl+1, ..., numsr-1, numsr] of which the sum is greater than or equal to target. If there is no such subarray, return 0 instead.
제한사항
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
풀이
투포인터
- 시작점과 끝점이 0번째 원소를 가리키도록한다.
- 현재 부분합이 target과 같다면 길이를 계산해 answer 값을 업데이트한다.
- 현재 부분합이 target보다 작다면 end를 1 증가 시킨다.
- 현재 부분합이 target보다 크다면 start를 1 증가 시킨다.
- 모든 경우를 확인할 때까지 2번부터 4번까지의 과정을 반복한다.
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
answer = len(nums)
interval_sum = 0
end = 0
if sum(nums) < target:
return 0
for start in range(len(nums)):
while interval_sum < target and end < len(nums):
interval_sum += nums[end]
end += 1
if interval_sum >= target:
answer = min(answer, end - start)
interval_sum -= nums[start]
return answer
Sliding Window
- 한번 시행할 때마다 target에서 nums[end] 의 값을 빼준다.
- 만약 target <= 0 이된다면 이 뜻은 nums[start] + nums[start + 1]+ ..... + nums[end]의 값이 target보다 같거나 크다는 뜻이므로 찾으려는 부분 배열이 된다.
- 부분 배열의 길이 값을 업데이트 해준다.
예시로 보면 아래와 같다.
target : 7
[2, 3, 1, 2, 4, 3]
1.
start = 0
end = 0
target -= nums[end] (target : 5)
end += 1
2.
start = 0
end = 1
target -= nums[end] (target: 2)
end += 1
3.
start = 0
end = 2
target -= nums[end] (target: 1)
end += 1
4.
start = 0
end = 3
target -= nums[end] (target: -1)
target <= 0 이므로 [2, 3, 1, 2]의 합이 target보다 크거나 작다는 뜻이다.
부분 배열의 길이는 end - start + 1 = 3 - 0 + 1 = 4
다른 부분 집합을 찾기 위해 start의 위치를 옮기며 부분 집합에서 빼준다. 즉 target이 0보다 클 때까지 nums[start]의 값을 더해준다.
end += 1
target += nums[start] (target : 1)
start += 1
5.
start = 1
end = 4
target -= nums[end] (target: -3)
end += 1
target += nums[start] (target : 0)
start += 1
[1,2,4] 라는 부분 집합을 찾았으므로 start의 위치를 옮기며 부분 집합에서 빼준다.
target += nums[start] (target : 1)
start += 1
.
.
.
전체 코드
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
start = 0
result = len(nums) + 1
for end in range(len(nums)):
target -= nums[end]
while target <= 0:
print(end, start)
result = min(result, end - start + 1)
target += nums[start]
start += 1
print()
return result % (len(nums) + 1)
len(nums) + 1로 초기화하고 결과 값을 나머지 계산한 이유는 부분 배열이 없을 경우 0을 리턴해야하기 때문이다.
반응형
'코테 문제 풀이' 카테고리의 다른 글
[리트코드] 1710. Maximum Units on a Truck (0) | 2022.04.12 |
---|---|
[리트코드] 76. Minimum Window Substring (0) | 2022.04.12 |
[리트코드] 724. Find Pivot Index (0) | 2022.04.11 |
[리트코드] 283. Move Zeroes (0) | 2022.04.11 |
[프로그래머스] 구명보트 - python (0) | 2022.04.09 |
Comments