LeetCode 209번: Minimum Size Subarray Sum(JAVA)

LeetCode 209번: Minimum Size Subarray Sum(JAVA)

문제출처 209번: Minimum Size Subarray Sum

❔ 문제


양의 정수 배열 nums의 부분 배열합이 target 이상이 되는 최소 부분 배열의 크기를 구하는 문제.

⏩ 예시


Input: ntarget = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: The subarray [4,3] has the minimal length under the problem constraint.

❕ 문제풀이


public static int minSubArrayLen(int target, int[] nums) {
    int s = 0;
    int e = 0;
    int result = nums.length + 1;

    if (nums.length == 1) return target <= nums[0] ? 1 : 0; // 1.

    int sum = nums[s];
    
    while (s <= e && e < nums.length) { // 2.
        if (sum >= target) result = Math.min(e-s+1, result); // 3.

        if (sum > target) { // 4.
            sum -= nums[s++];
        } else if (sum <= target && e + 1 < nums.length) {
            sum += nums[++e];
        } else {
            break;
        }
    }

    return result == nums.length+1 ? 0 : result; // 5.

}
  1. 배열의 크기가 1이면서 원소가 target보다 크거나 같다면 만족하는 최소 크기 1을 반환
  2. 투포인터에 사용될 index s와 e가 while문에서 탈출할 조건
  3. loop를 순환하면서 부분 배열의 합 sum이 target보다 크거나 같을 경우, 결과값 result와 비교하여 작은 부분 배열의 크기를 대체
  4. 부분 배열의 합이 클 경우 s작거나 같을 경우는 e를 한칸 증가시켜 부분 배열의 합을 변화시킨다.
  5. 결과값이 한번도 대체되지 않았다면 답이 없으므로 0, 아닐 경우 결과값을 반환한다.

💯 고찰


문제해결 과정을 머릿속에 구상한 부분까지 구현하여 채점을 했지만, 결과 값의 제약을 같을 때의 조건으로만 생각하여 많이 돌아갔다. 또한 크거나 같다는 조건으로 수행할 시 전체를 순환해야 하기에 탈출 조건을 다시 설계해야했다.

따라서 코드가 생각보다 어지러워지긴 했지만 최대한 결과에 맞게 구성하였다.

public int minSubArrayLen(int target, int[] nums) {
        int ans =Integer.MAX_VALUE;
        int sum=0;
        int i=0;int j=0;
        while(j<nums.length){
            sum+=nums[j];
            while(sum>=target){
                ans=Math.min(ans,j-i+1);
                sum-=nums[i++];
            }
            j++;
            
        }
         if(ans==Integer.MAX_VALUE){
             return 0;
         }
         else {
             return ans;
         }
    }

참고한 위 솔루션은 sliding window 방식을 이용한 풀이였다.
투포인터 방식과 상당히 유사하지만 비교 조건을 훨씬 간단하게 수행할 수 있기 때문에 코드가 훨씬 더 간결하다.