Hãy xem các bước để hoàn thành chương trình.
- Khởi tạo mảng.
- Chuyển tất cả các số 0 trong mảng thành -1.
- Có một bản đồ một bản đồ trống để lưu trữ các chỉ mục trước đó.
- Tổng khởi tạo thành 0, độ dài tối đa thành 0 và chỉ mục kết thúc thành -1.
- Viết một vòng lặp lặp lại cho đến n.
- Thêm phần tử hiện tại vào tổng.
- Nếu tổng bằng 0.
- Cập nhật độ dài tối đa với i + 1.
- Và kết thúc chỉ mục thành i.
- Nếu tổng xuất hiện trong bản đồ tổng trước đó và i - beforeIndexes [sum] lớn hơn độ dài tối đa.
- Cập nhật độ dài tối đa và chỉ mục kết thúc.
- Nếu không, hãy thêm tổng vào bản đồ chỉ mục trước đó.
- In chỉ mục bắt đầu endIndex - maxLength + 1 và chỉ mục kết thúc endIndex.
Ví dụ
Hãy xem mã.
#include <bits/stdc++.h> using namespace std; void findTheSubArray(int arr[], int n) { unordered_map<int, int> previousIndexes; int sum = 0, maxLength = 0, endingIndex = -1; for (int i = 0; i < n; i++) { arr[i] = arr[i] == 0 ? -1 : 1; } for (int i = 0; i < n; i++) { sum += arr[i]; if (sum == 0) { maxLength = i + 1; endingIndex = i; } if (previousIndexes.find(sum) != previousIndexes.end()) { if (maxLength < i - previousIndexes[sum]) { maxLength = i - previousIndexes[sum]; endingIndex = i; } }else { previousIndexes[sum] = i; } } cout << endingIndex - maxLength + 1 << " " << endingIndex << endl; } int main() { int arr[] = { 1, 1, 0, 0, 0, 1, 1, 1, 0 }; findTheSubArray(arr, 9); return 0; }
Đầu ra
Nếu bạn chạy đoạn mã trên, thì bạn sẽ nhận được kết quả sau.
1 8
Kết luận
Nếu bạn có bất kỳ câu hỏi nào trong hướng dẫn, hãy đề cập đến chúng trong phần bình luận.