C ++中具有相等的0和1的最大子数组

让我们看看完成程序的步骤。

  • 初始化数组。

  • 使数组中的所有零为-1。

  • 有一个映射为空的映射来存储以前的索引。

  • 初始化总和为0,最大长度为0,结束索引为-1。

  • 编写一个循环直到n的循环。

    • 更新最大长度和结束索引。

    • 用i + 1更新最大长度。

    • 并结束索引到我。

    • 将当前元素相加。

    • 如果总和等于0。

    • 如果该总和存在于先前的总和映射中,并且i-previousIndexes [sum]大于最大长度。

    • 否则将总和添加到先前的索引映射中。

    • 打印起始索引EndingIndex-maxLength + 1和结束索引EndingIndex。

    示例

    让我们看一下代码。

    #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;
    }
    输出结果

    如果运行上面的代码,则将得到以下结果。

    1 8

    结论