LeetCode-209. 최소 길이의 서브 어레이 슬라이딩 윈도우 방식

209. 가장 작은 하위 배열

제목 설명

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;
    }

추천

출처blog.csdn.net/qq_35655602/article/details/115103811