使用 C++ 查詢包含 m 個奇數的子陣列個數


如果您曾經使用過 C++,您一定知道子陣列是什麼以及它們有多麼有用。眾所周知,在 C++ 中,我們可以輕鬆解決多個數學問題。因此,在本文中,我們將解釋如何使用 C++ 中的這些子陣列來查詢 M 個奇數的完整資訊。

在這個問題中,我們需要找到由給定陣列和整數 m 形成的許多子陣列,其中每個子陣列恰好包含 m 個奇數。這是一個簡單的示例:

Input : array = { 6,3,5,8,9 }, m = 2
Output : 5
Explanation : Subarrays with exactly 2 odd numbers are
{ 3,5 }, { 6,3,5 }, { 3,5,8 }, { 5,8,9 }, { 6,3,5,8 }, { 3,5,8,9 }

Input : array = { 1,6,3,2,5,4 }, m = 2
Output : 6
Explanation : Subarrays with exactly 2 odd numbers are
{ 1,6,3 }, { 3,2,5 }, { 1,6,3,2 }, { 6,3,2,5 }, { 3,2,5,4 }, { 6,3,2,5,4 }

第一種方法

在這種方法中,所有可能的子陣列都是從給定陣列生成的,並且檢查每個子陣列是否恰好包含 m 個奇數。這是一個簡單的生成和查詢方法,這種方法的時間複雜度為 O(n2)。

示例

#include <bits/stdc++.h>
using namespace std;
int main (){
    int a[] = { 1, 6, 3, 2, 5, 4 };
    int n = 6, m = 2, count = 0; // n is size of array, m numbers to be find in subarrays,
                              // count is number of subarray with m odd numbers
    for (int i = 0; i < n; i++){ // outer loop to process each element.
        int odd = 0;
        for (int j = i; j < n; j++) {// inner loop to find subarray with m number
            if (a[j] % 2)
                odd++;
            if (odd == m) // if odd numbers become equals to m.
                count++;
        }
    }
    cout << "Number of subarrays with n numbers are: " << count;
    return 0;
}

輸出

Number of subarrays with n numbers are: 6

以上程式碼的解釋

在此程式碼中,我們使用巢狀迴圈來查詢包含 m 個奇數的子陣列,外迴圈用於遞增“i”,這將用於處理陣列中的每個元素。

內迴圈用於查詢子陣列並處理元素,直到奇數計數器達到 m,為找到的每個子陣列增加結果計數器 count,最後列印儲存在 count 變數中的結果。

第二種方法

另一種方法是建立一個數組來儲存具有“i”個奇數的字首的數量,處理每個元素,併為找到的每個奇數增加奇數的數量。

當奇數計數超過或等於 m 時,在 prefix 陣列中新增 (odd - m) 位置的數字。

當奇數大於或等於 m 時,我們計算到該索引為止形成的子陣列的數量,並將“odd - m”個數字新增到 count 變數中。處理每個元素後,結果儲存在 count 變數中。

示例

#include <bits/stdc++.h>
using namespace std;
int main (){
    int array[ ] = { 1, 6, 3, 2, 5, 4 };
    int n = 6, m = 2, count = 0, odd = 0, i;
    int prefix_array[n + 1] = { 0 };
    // outer loop to process every element of array
    for (i = 0; i < n; i++){
        prefix_array[odd] = prefix_array[odd] + 1;    // implementing value at odd index in prefix_array[ ]
        // if array element is odd then increment odd variable
        if (array[i] % 2 == 0)
            odd++;
        // if Number of odd element becomes equal or greater than m
        //  then find the number of possible subarrays that can be formed till the index.
        if (odd >= m)
            count += prefix_array[odd - m];
    }
    cout << "Number of subarrays with n numbers are: " << count;
    return 0;
}

輸出

Number of subarrays with n numbers are: 6

以上程式碼的解釋

初始化陣列和變數為起始值:

int array[ 6 ] = { 1, 6, 3, 2, 5, 4 };
int n = 6, m = 2, count = 0, odd = 0, i;
int prefix_array[n + 1] = { 0 };

在此,我們使用陣列大小初始化變數 n,使用奇數個數初始化變數 m,使用 0 初始化 count 以計數可能的子陣列,使用 0 初始化 odd,以及使用 0 初始化大小為 n+1 的 prefix_array。

理解迴圈

for (i = 0; i < n; i++){
   prefix_array[odd] = prefix_array[odd] + 1;
   if (array[i] % 2 == 0)
      odd++;
      if (odd >= m)
         count += prefix_array[odd - m];
}

在此迴圈中,我們在 prefix_array[] 中實現奇數索引的值,然後如果找到奇數,則遞增奇數變數。當奇數變數等於或大於 m 時,我們找到可以到該索引為止形成的子陣列的數量。

最後,我們列印儲存在 count 變數中的包含 m 個奇數的子陣列的數量,並獲得輸出。

結論

在本文中,我們瞭解了兩種方法來查詢包含 m 個奇數的子陣列的數量:

  • 生成每個子陣列並檢查其中是否存在 m 個奇數,併為找到的每個子陣列遞增計數。此程式碼的時間複雜度為 O(n2)。

  • 高效的方法,它遍歷陣列的每個元素並建立一個字首陣列,並藉助字首陣列找到結果。此程式碼的時間複雜度為 O(n)。

希望本文能幫助您理解問題和解決方案。

更新於:2021年11月25日

194 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.