슬라이딩 윈도우 패턴
슬라이딩 윈도우 패턴 인식
역시 슬라이딩 윈도우 패턴은 데이터의 하위 집합을 추적하는 데 매우 유용합니다. 이것은 종종 배열에 있고 데이터는 연속적입니다. 다음은 슬라이딩 윈도우 패턴을 사용하여 해결할 수 있는 예제 문제입니다.
정수 배열과 n이라는 숫자를 받아들이는 maxSubarraySum이라는 함수를 작성하십시오. 이 함수는 배열에 있는 n개의 연속 요소의 최대 합계를 계산해야 합니다.
일부 예제 입력은 다음과 같습니다.
maxSubarraySum([1,2,5,2,8,1,5], 2) => 10
maxSubarraySum([1,2,5,2,8,1,5], 4) => 17
maxSubarraySum([4,2,1,6], 1) => 6
maxSubarraySum 문제 해결
다음 솔루션은 시간 복잡도 O(N)입니다. 많은 사람들이 순진하거나 "쉬운"솔루션을 가르치는 것으로 시작할 수 있습니다. 대신 슬라이딩 윈도우 패턴을 사용하는 이 솔루션을 살펴보겠습니다. 이제 이 패턴이 어떻게 작동하는지 이해할 수 있다면 다른 유사한 문제를 인식하기 시작할 것이고 이러한 문제에도 슬라이딩 윈도우 패턴을 적용할 수 있을 것입니다. 또한 이 솔루션에 따라 훨씬 더 나은 시간 복잡도를 얻을 수 있습니다.
function maxSubarraySum(arr, num) {
let maxSum = 0;
let tempSum = 0;
if(arr.length < num) return null;
for(let i = 0; i < num; i++) {
maxSum += arr[i];
}
tempSum = maxSum;
for (let i = num; i < arr.length; i++) {
tempSum = tempSum - arr[i-num] + arr[i];
maxSum = Math.max(maxSum, tempSum);
}
return maxSum;
}
그렇다면 이 솔루션은 무엇을 하는 것일까요?
먼저 maxSum과 tempSum이라는 두 변수를 선언합니다. 이들은 코드에서 조금 더 아래에서 사용됩니다. 배열이 유효하지 않은 경우를 확인하는 if 문이 있습니다. Num은 배열에서 합계를 찾는 데 필요한 숫자입니다. 숫자가 배열의 길이보다 크면 유효한 합계를 얻을 수 없으므로 null을 반환합니다.
그런 다음 첫 번째 합계를 만듭니다.
이 예를 들어 3을 전달해 보겠습니다.
maxSubarraySum([2,6,9,2,1,8,5,6,3], 3)
배열의 시작 부분으로 이동하여 처음 3개의 숫자(2, 6 및 9)를 합산합니다. 이 숫자의 합을 maxSum이라는 변수에 저장합니다. 그런 다음 tempSum을 maxSum과 동일하게 설정합니다(함수 끝에서 maxSum을 반환함). 이제 또 다른 루프를 시작합니다. 시작 부분 또는 인덱스 0에서 시작하는 대신 이미 합산한 처음 3개의 숫자 다음에 루프를 시작합니다. 이 경우 인덱스 3(2)에서 시작합니다.tempSum은 현재 값 17(2+6+9)을 저장하고 있으며 인덱스 4에서 2를 더하고 인덱스 0에서 2를 뺍니다. 합계를 다시 확인하면 여전히 값이 17입니다. 루프를 다시 반복할 때 tempSum(17)에 1(인덱스 5)을 더하고 6(인덱스 1)을 뺍니다. 새로운 tempSum은 (9+2+1)입니다. for 루프의 마지막 줄은 maxSum과 tempSum 사이의 최대값을 사용합니다. tempSum이 maxSum 값보다 크면 maxSum 값을 덮어씁니다. 그렇지 않으면 계속 반복합니다.
이 솔루션이 O(N) 시간 복잡도에서 작동하는 이유는 무엇입니까?
우리는 백만 자릿수 또는 수백만 자릿수를 가질 수 있습니다. 슬라이딩 윈도우 패턴의 장점은 배열을 한 번만 반복하면 된다는 것입니다.
이 질문과 해결책을 연습하십시오. 그런 다음 더 많은 슬라이딩 윈도우 패턴 문제를 찾기 시작합니다. 한 번 시도해 보세요.
양의 정수 배열과 양의 정수라는 두 개의 매개변수를 받는 minSubArrayLen이라는 함수를 작성하세요. 이 함수는 합계가 함수에 전달된 정수보다 크거나 같은 연속 하위 배열의 최소 길이를 반환해야 합니다. 하나도 없으면 대신 0을 반환합니다.
예:
minSubArrayLen([2,3,1,2,4,3], 7) => 2 ([4,3] is the smallest subarray)
minSubArrayLen([4,3,3,8,1,2,3], 11) => 2
Reference
이 문제에 관하여(슬라이딩 윈도우 패턴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bradbieselin/the-sliding-window-pattern-3nei텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)