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

    结论

    以上是 C ++中具有相等的0和1的最大子数组 的全部内容, 来源链接: utcz.com/z/345876.html

    回到顶部