209. Minimum Size Subarray Sum
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.
A subarray is a contiguous non-empty sequence of elements within an array.
nums
, 특정 숫자 target
nums
의 부분 배열들에 대해 원소들의 합이 target
보다 같거나 큰 부분 배열 중 부분 배열 길이의 최소값1차 전략 (double pointer와 유사하게)
front
, back
을 전부 0
을 가리키도록 함sum
을 front
부터 back
까지의 합으로 구함sum
이 target
보다 크거나 같다면 minSize
와 비교하여 더 작은 값을 minSize
에 할당함, 그 후 front
를 앞으로 한칸 이동함sum
이 target
보다 작다면 back
을 앞으로 한칸 이동함1차 전략의 문제점
sum
을 구해야 하기 때문에 Time complexity가 O(n^2)이 된다.부분배열 원소의 합
)이 규칙적으로 변화한다.front
, back
을 전부 0
을 가리키도록 함tempSum
을 nums[0]
으로 설정함tempSum
이 target
보다 크거나 같다면 minSize
와 비교하여 더 작은 값을 minSize
에 할당함, 그 후 front
를 앞으로 한칸 이동, 빠진 원소를 tempSum
에서 뺀다.tempSum
이 target
보다 작다면 back
을 앞으로 한칸 이동, 더해진 원소를 tempSum
에서 더한다.class Solution {
public int minSubArrayLen(int target, int[] nums) {
int minSize = 0;
int tempSum = nums[0];
int front = 0;
int back = 0;
while(front <= back) {
if (tempSum < target) {
if (back >= nums.length - 1) {
break;
}
back++;
tempSum += nums[back];
} else if (tempSum >= target) {
if (minSize == 0) minSize = back - front + 1;
minSize = Math.min(minSize, back - front + 1);
tempSum -= nums[front];
front++;
}
}
return minSize;
}
}
back
, front
차이가 minSize
보다 크거나 같은 경우를 체크하지 않는 방법이 있다.class Solution {
public int minSubArrayLen(int target, int[] nums) {
int minSize = nums.length + 1;
int tempSum = nums[0];
int front = 0;
int back = 0;
while(front <= back && (tempSum >= target || back < nums.length - 1)) {
if (tempSum < target) {
back++;
tempSum += nums[back];
if (minSize <= back - front + 1) { // 크기가 minSize보다 클 때
tempSum -= nums[front];
front++; // 생각하지 않고 다음으로 넘어간다.
}
} else {
minSize = back - front + 1;
tempSum -= nums[front];
front++;
}
}
return minSize != nums.length + 1 ? minSize : 0;
}
}