자연수로 이루어진 nums
배열에서 합이 target
이상인 subarray 중 가장 짧은 길이를 리턴하는 문제이다.
시작 인덱스(left
)와 끝 인덱스(right
) 사이의 모든 원소의 합(sum
)을 관리하는 방법으로 sliding window으로 풀이하였다. left
가 증가하면 sum
이 감소하며 right
가 증가하면 sum
이 증가한다.
sum
이 target
이상이면 answer
값을 업데이트하며 길이가 최소인 것을 찾아야하기 때문에 현재 left
에 해당하는 원소 값을 sum
에서 빼주고 left
를 증가시킨다.
반대로 sum
이 target
미만이면 sum
을 증가시켜주기 위해 right
를 증가시키는데 만약 right
가 nums.length - 1
값이라면 반복문을 탈출한다. right
가 끝에 도달해 right
를 증가시키지 못하며 sum
또한 증가시키지 못하기 때문에 sum
이 target
이상인 경우를 찾을 수 없기 때문이다.
left = 0, right = 0, sum = nums[0]
while
if sum >= target then
answer = min(answer, right - left + 1)
sum -= nums[left++]
else
if right == numns.length - 1 then break
else sum += nums[++right]
이 방법은 시간복잡도 이며 공간복잡도는 이다.
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0, right = 0;
int sum = nums[0];
int answer = Integer.MAX_VALUE;
while(true) {
if (sum >= target) {
answer = Math.min(answer, right - left + 1);
sum -= nums[left++];
} else {
if (right == nums.length - 1) {
break;
} else {
sum += nums[++right];
}
}
}
return answer == Integer.MAX_VALUE ? 0 : answer;
}
}
시간복잡도에 이 들어가면 보통 분할하는 방법이 쓰이는거라 감으로 이진탐색이 쓰이는 것같았지만 풀이를 생각하지는 못했다. Solution에서 풀이를 찾아봤지만 완전히 이해하지 못해 다시 풀어봐야할 것같다.