이 문제에서 정수 값의 배열이 주어지고 이 배열에서 합이 0인 모든 하위 배열을 인쇄해야 합니다.
주제를 더 잘 이해하기 위해 예를 들어 보겠습니다.
입력:배열 =[-5, 0, 2, 3, -3, 4, -1]출력:합계가 0인 하위 배열은 1에서 4까지입니다. 합계가 0인 하위 배열은 5에서 7까지 합계가 0인 하위 배열은 다음과 같습니다. 0에서 7까지
이 문제를 해결하기 위해 가능한 모든 하위 배열을 확인합니다. 그리고 이 하위 배열의 합이 0인지 확인하고 인쇄합니다. 이 솔루션은 이해하기 쉽지만 솔루션이 복잡하고 시간 복잡도가 O(n^2)입니다. .
이 문제에 대한 더 나은 솔루션은 해싱을 사용하는 것입니다. 이 문제를 해결하기 위해 합이 0이면 해시 테이블에 추가합니다.
알고리즘
1단계:합계 변수를 생성합니다.2단계:합계가 0이면 하위 배열은 인덱스 0부터 배열의 끝 인덱스까지 시작합니다.3단계:현재 합계가 해시 테이블에 있는 경우4단계:합계가 0이면 하위 배열 존재하는 경우 i+1에서 n까지의 하위 배열은 0이어야 합니다. 5단계:그렇지 않으면 해시 테이블에 삽입합니다.
예시
#include네임스페이스 std;vector > findSubArrayWithSumZero(int arr[], int n){ unordered_map >map; 벡터 <쌍 > 출력; 정수 합계 =0; for (int i =0; i vc =map[sum]; for (자동 it =vc.begin(); it !=vc.end(); it++) out.push_back(make_pair(*it + 1, i)); } 맵[sum].push_back(i); } 리턴 아웃;}int main(){ int arr[] ={-5, 0, 2, 3, -3, 4, -1}; 정수 n =sizeof(arr)/sizeof(arr[0]); 벡터<쌍 > 출력 =findSubArrayWithSumZero(arr, n); if (out.size() ==0) cout <<"하위배열이 존재하지 않습니다"; else for (auto it =out.begin(); it !=out.end(); it++) cout<<"합이 0인 하위 배열은 "< 첫 번째 <<"에서 "< 까지입니다. 두 번째<<끝; 반환 0;}
출력
합이 0인 부분배열은 1에서 1사이입니다. 합이 0인 부분배열은 0에서 3사이입니다. 합이 0인 부분배열은 3에서 4사이입니다. 합이 0인 부분배열은 0에서 6사이입니다.