var minSubArrayLen = function (target, nums) {
let start = 0;
let sum = 0;
let length = Number.MAX_SAFE_INTEGER;
for (let end = 0; end < nums.length; end++) {
sum += nums[end];
// console.log('pastSum: ', sum);
while (sum >= target) {
length = Math.min(length, end - start + 1);
sum -= nums[start];
// console.log('curSum: ', sum);
start++;
}
}
return length === Number.MAX_SAFE_INTEGER ? 0 : length;
};
이전에 풀었던 문제(링크)와 유사하게 슬라이딩 윈도우 알고리즘(참고 링크)을 사용한 배열 문제다. target
=== Subarray의 합계가 되어야 하는데, 조건을 만족하는 Subarray중 가장 짧은 길이를 가진 Subarray의 길이를 return
하면 되는 문제다.
start
포인터와 end
포인터를 지정해주고 end
포인터가 먼저 loop을 돌 때마다 하나씩 증가하도록 만들어준다. start
포인터는 sum
이 target
보다 크거나 같을 때만 sum
을 start
index에 해당하는 요소를 반복해서 빼준다. 한번 sum
에서 마이너스 할 때마다 start
index를 앞으로 한 칸 옮겨준다.
만약 모든 nums
배열의 모든 요소의 합이 target
보다 작다면 length
가 여전히 Number.MAX_SAFE_INTEGER
이기 때문에 마지막에 삼항 연산자를 사용해 return
해준다.
수정, 지적을 환영합니다!
https://leetcode.com/problems/minimum-size-subarray-sum/