Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++를 사용하여 합이 K보다 작은 부분배열의 수 찾기

<시간/>

이 글에서 우리는 C++를 사용하여 합이 K보다 작은 부분배열의 수를 알아낼 것이다. 이 문제에서 배열 arr[]와 정수 K가 있습니다. 이제 합이 K보다 작은 하위 배열을 찾아야 합니다. 예는 다음과 같습니다. -

Input : arr[] = {1, 11, 2, 3, 15}
K = 10
Output : 4
{1}, {2}, {3} and {2, 3}

해결 방법 찾기

이제 우리는 주어진 문제를 해결하기 위해 두 가지 다른 방법을 사용할 것입니다 -

브루트 포스

이 접근 방식에서는 모든 하위 배열을 반복하고 합계를 계산하고 합계가 k보다 작은 경우 k와 비교하여 답을 증가시킵니다.

예시

#include <bits/stdc++.h>
using namespace std;
int main(){
    int arr[] = {1, 11, 2, 3, 15}; // given array
    int k = 10; // given k
    int size = sizeof(arr) / sizeof(int); // size of our array.
    int ans = 0; // counter variable.
    for(int i = 0; i < size; i++){ // outer loop.
        int sum = 0;
        for(int j = i; j < size; j++){ // inner loop.
            sum = sum + arr[j];
            if(sum < k) // comparing with k.
               ans++; // incrementing our ans if sum is less than k.
        }
    }
    cout << ans << "\n";
    return 0;
}

출력

4

그러나 이 접근 방식은 시간 복잡도가 매우 높기 때문에 그다지 좋지 않습니다. O(N*N) , 여기서 n은 배열의 크기입니다.

Sliding Window 방법을 사용하는 다른 솔루션을 살펴보겠습니다(프로그램의 시간 복잡성을 줄이는 데 도움이 됩니다).

효율적인 접근

무차별 대입과 달리 , 우리는 모든 하위 배열을 거치지 않을 것입니다. 대신, 하위 배열의 합이 k를 초과하고 왼쪽 경계를 오른쪽 경계까지 이동하고 전체 배열이 탐색될 때까지 계속 반복할 때만 탐색합니다.

예시

#include <bits/stdc++.h>
using namespace std;
int main(){
    int arr[] = {1, 11, 2, 3, 15}; // given array
    int k = 10; // given k
    int size = sizeof(arr) / sizeof(int); // size of our array.
    int ans = 0; // counter variable.
    int start = 0; // left border.
    int end = 0; // right border.
    int sum = 0;
    while(end < size && start < size){ // till the whole array is traversed.
        while(sum >= k && start < end){
           sum = sum - arr[start];
           start++;
        }
        if(end >= start)
           ans = ans + end - start;
        sum += arr[end];
        end++;
    }
    cout << ans << "\n";
    return 0;
}

출력

4

슬라이딩 창 기법을 사용합니다. 이 접근 방식에서 더 큰 제약 조건에 대해 실행하기 위해 프로그램을 더 빠르고 효율적으로 만들 수 있습니다.

위 코드 설명

이 접근 방식에서 우리는 일반적으로 합이 k보다 작을 때까지 탐색하고 그에 따라 답을 증가시키는 것은 합이 k보다 크거나 같을 때 발생하는 코드의 중요한 변경입니다. 이 상황에서 우리는 왼쪽 경계를 오른쪽 경계보다 작게 또는 합이 k보다 크거나 같을 때까지 증가시키기 시작합니다. 더 처리하면 형성될 수 있는 다른 하위 배열을 통과합니다. 합이 k보다 작은 이러한 새 하위 배열이 우리의 답에 추가되므로 답이 증분됩니다.

이 접근 방식은 이전 Brute Force에 비해 매우 효율적입니다. 시간 복잡도가 O(N)이므로 적용했습니다. , 여기서 N은 배열의 크기입니다.

결론

이 기사에서는 슬라이딩 창 기법을 사용하여 합이 k보다 작은 부분배열의 수를 찾는 문제를 해결합니다. . 우리는 또한 이 문제에 대한 C++ 프로그램과 이 문제를 해결하는 완전한 접근 방식( Normal 및 Efficient)을 배웠습니다. C, Java, python 및 기타 언어와 같은 다른 언어로 동일한 프로그램을 작성할 수 있습니다. 이 기사가 도움이 되기를 바랍니다.