首頁 >後端開發 >C++ >使用C++編寫,找到和為k^m形式的子數組數量,其中m >= 0

使用C++編寫,找到和為k^m形式的子數組數量,其中m >= 0

王林
王林轉載
2023-09-06 09:45:02580瀏覽

使用C++编写,找到和为k^m形式的子数组数量,其中m >= 0

在本文中,我們將解釋有關在 C 中求解總和為 k^m, m >= 0 的子數組數量的所有內容。給定一個數組arr[] 和一個整數K,我們需要找到具有K^m 形式的和的子數組的數量,其中m 大於等於0,或者我們可以說我們需要找到具有K^m 形式的子數組的數量總和等於K 的某個非負冪。

Input: arr[] = { 2, 2, 2, 2 } K = 2

Output: 8

Sub-arrays with below indexes are valid:
[1, 1], [2, 2], [3, 3], [4, 4], [1, 2],
[2, 3], [3, 4], [1, 4]

Input: arr[] = { 3, -6, -3, 12 } K = -3

Output: 3

主要有兩種方法-

暴力破解

在這種方法中,我們將遍歷所有子數組並檢查它們是否是K 與否;如果是,則我們增加計數。

範例

#include <bits/stdc++.h>
#define MAX 1000000
using namespace std;
int main(){
   int arr[] = {2, 2, 2, 2}; // given array
   int k = 2; // given integer
   int n = sizeof(arr) / sizeof(arr[0]); // the size of our array
   int answer = 0; // counter variable
   for(int i = 0; i < n; i++){
      int sum = 0;
      for(int j = i; j < n; j++){ // this will loop will make all the subarrays
         sum += arr[j];
         int b = 1;
         while(b < MAX && sum > b) // k^m Max should be 10^6
            b *= k;
         if(b == sum) // if b == sum then increment count
            answer++;
      }
   }
   cout << answer << "\n";
}

輸出

8

但是,這個方法並不是很好,因為程式的時間複雜度為O(N*N*log (K)),,其中N 是陣列的大小,K 是陣列的大小。使用者給定的整數。

這種複雜性不好,因為這種複雜性可以用於更高的約束,因為如果約束很大,則需要花費太多時間來處理,因此我們將嘗試另一種方法,以便我們可以使用該程式來實現更高的約束。

高效方法

在這種方法中,我們將使用前綴和和映射來減少處理,從而大大降低時間複雜度。

範例

#include <bits/stdc++.h>
#define ll long long
#define MAX 1000000
using namespace std;
int main(){
   int arr[] = {2, 2, 2, 2}; // The given array
   int n = sizeof(arr) / sizeof(arr[0]); // size of our array
   int k = 2; // given integer
   ll prefix_sum[MAX];
   prefix_sum[0] = 0;
   partial_sum(arr, arr + n, prefix_sum + 1); // making prefix sum array
   ll sum;
   if (k == 1){
   // we are going to check separately for 1
      sum = 0;
      map<ll, int> m;
   for (int i = n; i >= 0; i--){
      // If m[a+b] = c, then add c to the current sum.
      if (m.find(prefix_sum[i] + 1) != m.end())
         sum += m[prefix_sum[i] + 1];
         // Increase count of prefix sum.
         m[prefix_sum[i]]++;
      }
      cout << sum << "\n";
   }
   else if (k == -1){
      // we are going to check separately for -1
      sum = 0;
      map<ll, int> m;
      for (int i = n; i >= 0; i--){
         // If m[a+b] = c, then add c to the current sum.
         if (m.find(prefix_sum[i] + 1) != m.end())
            sum += m[prefix_sum[i] + 1];

         if (m.find(prefix_sum[i] - 1) != m.end())
            sum += m[prefix_sum[i] - 1];

         // Increase count of prefix sum.
         m[prefix_sum[i]]++;
      }
      cout << sum << "\n";
   }
   else{
      sum = 0;
      ll b;
      map<ll, int> m;
      for (int i = n; i >= 0; i--){
         b = 1;
         while (b < MAX){ // we are not going to check for more than 10^6
            // If m[a+b] = c, then add c to the current sum.
            if (m.find(prefix_sum[i] + b) != m.end())
               sum += m[prefix_sum[i] + b];
               b *= k;
         }
         m[prefix_sum[i]]++;
      }
      cout << sum << "\n";
   }
   return 0;
}

輸出

8

結論

#我們解決了一個問題,找到總和為k^m 形式的子數組的數量,其中m >= 0,時間複雜度為O(nlog(k)log(n))時間複雜度。我們也學習了解決這個問題的C 程序以及解決這個問題的完整方法(正常且有效率)。我們可以用其他語言像是C、java、python等語言來寫同樣的程式。希望這篇文章對您有幫助。

以上是使用C++編寫,找到和為k^m形式的子數組數量,其中m >= 0的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除