제목 설명
n 개의 양의 정수와 양의 정수 대상을 포함하는 배열이 제공됩니다.
배열에서 합이 ≥ 목표를 충족하는 가장 작은 길이를 가진 연속 하위 배열 [numsl, numsl + 1,…, numsr-1, numsr]을 찾아 그 길이를 반환합니다. 기준을 충족하는 하위 배열이 없으면 0이 반환됩니다.
예 1 :
입력 : target = 7, nums = [2,3,1,2,4,3]
출력 : 2
설명 : 하위 배열 [4,3]은이 조건에서 가장 작은 길이를 가진 하위 배열입니다.
예 2 :
입력 : target = 4, nums = [1,4,4]
출력 : 1
예제 3 :
입력 : target = 11, nums = [1,1,1,1,1,1,1,1]
출력 : 0
문제 해결 아이디어
슬라이딩 윈도우 방식 슬라이딩 윈도우 방식
의 일반적인 논리
int left = 0,right = 0;
while(right < s.length()){
//增大窗口
window.add(s[right]);
right++;
//debug
System.out.println("left:" + left +",right:" + right);
while(window needs shrink){
//缩小窗口
window.remove(s[left]);
left++;
//进行窗口内数据的一系列更新
}
}
템플릿 세트의 시작 부분에서 다음 네 가지 질문 만 생각
하면됩니다 . 1. 오른쪽으로 이동하여 창을 확장 할 때 즉, 문자를 추가 할 때 어떤 데이터를 업데이트해야합니까?
2. 어떤 조건에서 창을 확장하려면 일시 중지하고 창을 축소하려면 왼쪽으로 이동해야합니까?
3. 창을 축소하기 위해 왼쪽으로 이동할 때, 즉 문자를 이동할 때 어떤 데이터를 업데이트해야합니까?
4. 창을 확대하거나 축소 할 때 원하는 결과를 업데이트해야합니까?
슬라이딩 윈도우 방식
public int minSubArrayLen_1(int target, int[] nums) {
if (nums.length == 0 || target == 0)
return 0;
if (nums.length == 1 && target == nums[0]){
return 1;
}
int ans = Integer.MAX_VALUE;
int left = 0;
int right = 0;
int sum = 0;
while (right < nums.length){
sum = sum + nums[right];
while (sum >= target){
ans = Math.min(right - left + 1,ans);
sum = sum - nums[left];
left++;
}
right++;
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
폭력 법
public int minSubArrayLen(int target, int[] nums) {
int min = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
int sum = nums[i];
if (sum >= target){
return 1;
}
for (int j = i + 1; j < nums.length; j++) {
sum += nums[j];
if (sum >= target){
min = Math.min(min,j - i + 1);
break;
}
}
}
return min == Integer.MAX_VALUE ? 0 : min;
}