在本文中,我們將解釋有關在 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中文網其他相關文章!