Bir dizi verildiğinde varış[] ve bir tamsayı k görev, toplamı olan tüm alt dizileri saymaktır. k'ye bölünebilir .
Örnekler:
Giriş: dizi[] = [4 5 0 -2 -3 1] k = 5
Çıkış: 7
Açıklama: Toplamı 5'e bölünebilen 7 alt dizi vardır: [4 5 0 -2 -3 1] [5] [5 0] [5 0 -2 -3] [0] [0 -2 -3] ve [-2 -3].Giriş: dizi[] = [2 2 2 2 2 2] k = 2
Çıkış: 21
Açıklama: Tüm alt dizi toplamları 2'ye bölünebilir.Giriş: dizi[] = [-1 -3 2] k = 5
Çıkış:
Açıklama: Toplamı k'ye bölünebilen bir alt dizi yoktur.
İçerik Tablosu
- [Naif Yaklaşım] Tüm alt diziler üzerinde yineleme
- [Beklenen Yaklaşım] Önek Toplamını Kullanma modulo k
[Naif Yaklaşım] Tüm alt diziler üzerinde yineleme
Buradaki fikir, dizilerin izini sürdürürken olası tüm alt diziler üzerinde yineleme yapmaktır. alt dizi modulo k toplamı . Herhangi bir alt dizi için, modulo k alt dizisinin alt değeri 0 olursa, sayımı 1 artırın. Tüm alt diziler üzerinde yineleme yaptıktan sonra, sayımı sonuç olarak döndürün.
C++// C++ Code to Count Subarrays With Sum Divisible By K // by iterating over all possible subarrays #include #include using namespace std; int subCount(vector<int> &arr int k) { int n = arr.size() res = 0; // Iterating over starting indices of subarray for(int i = 0; i < n; i++) { int sum = 0; // Iterating over ending indices of subarray for(int j = i; j < n; j++) { sum = (sum + arr[j]) % k; if(sum == 0) res += 1; } } return res; } int main() { vector<int> arr = {4 5 0 -2 -3 1}; int k = 5; cout << subCount(arr k); }
C // C Code to Count Subarrays With Sum Divisible By K // by iterating over all possible subarrays #include int subCount(int arr[] int n int k) { int res = 0; // Iterating over starting indices of subarray for (int i = 0; i < n; i++) { int sum = 0; // Iterating over ending indices of subarray for (int j = i; j < n; j++) { sum = (sum + arr[j]) % k; if (sum == 0) res += 1; } } return res; } int main() { int arr[] = {4 5 0 -2 -3 1}; int k = 5; int n = sizeof(arr) / sizeof(arr[0]); printf('%d' subCount(arr n k)); return 0; }
Java // Java Code to Count Subarrays With Sum Divisible By K // by iterating over all possible subarrays import java.util.*; class GfG { static int subCount(int[] arr int k) { int n = arr.length res = 0; // Iterating over starting indices of subarray for (int i = 0; i < n; i++) { int sum = 0; // Iterating over ending indices of subarray for (int j = i; j < n; j++) { sum = (sum + arr[j]) % k; if (sum == 0) res += 1; } } return res; } public static void main(String[] args) { int[] arr = {4 5 0 -2 -3 1}; int k = 5; System.out.println(subCount(arr k)); } }
Python # Python Code to Count Subarrays With Sum Divisible By K # by iterating over all possible subarrays def subCount(arr k): n = len(arr) res = 0 # Iterating over starting indices of subarray for i in range(n): sum = 0 # Iterating over ending indices of subarray for j in range(i n): sum = (sum + arr[j]) % k if sum == 0: res += 1 return res if __name__ == '__main__': arr = [4 5 0 -2 -3 1] k = 5 print(subCount(arr k))
C# // C# Code to Count Subarrays With Sum Divisible By K // by iterating over all possible subarrays using System; using System.Collections.Generic; class GfG { static int subCount(int[] arr int k) { int n = arr.Length res = 0; // Iterating over starting indices of subarray for (int i = 0; i < n; i++) { int sum = 0; // Iterating over ending indices of subarray for (int j = i; j < n; j++) { sum = (sum + arr[j]) % k; if (sum == 0) res += 1; } } return res; } static void Main() { int[] arr = { 4 5 0 -2 -3 1 }; int k = 5; Console.WriteLine(subCount(arr k)); } }
JavaScript // JavaScript Code to Count Subarrays With Sum Divisible By K // by iterating over all possible subarrays function subCount(arr k) { let n = arr.length res = 0; // Iterating over starting indices of subarray for (let i = 0; i < n; i++) { let sum = 0; // Iterating over ending indices of subarray for (let j = i; j < n; j++) { sum = (sum + arr[j]) % k; if (sum === 0) res += 1; } } return res; } // Driver Code let arr = [4 5 0 -2 -3 1]; let k = 5; console.log(subCount(arr k));
Çıkış
7
Zaman Karmaşıklığı: O(n^2) alt dizilerin tüm olası başlangıç ve bitiş noktaları üzerinde yineleme yaptığımız için.
Yardımcı Alan: Ç(1)
[Beklenen Yaklaşım] Önek Toplamını Kullanma modulo k
Fikir kullanmaktır Önek Toplamı Tekniği ile birlikte karma . Dikkatli bir şekilde gözlemleyerek şunu söyleyebiliriz ki, eğer bir dizi[i...j] alt dizisi k'ye bölünebilen bir toplama sahipse, o zaman (önek toplam[i] %k), (önek toplam[j] %k)'ye eşit olacaktır. Böylece (önek toplamı mod k) sayısını saymak için bir karma harita veya sözlüğü korurken arr[] üzerinde yineleme yapabiliriz. Her bir i indeksi için, i'de biten ve toplamı k'ye bölünebilen alt dizilerin sayısı, (önek toplam[i] mod k)'nin i'den önceki oluşum sayısına eşit olacaktır.
Java dizisi sıralandı
Not: (Önek toplamı mod k)'nin negatif değerinin aşağıdaki gibi dillerde ayrı olarak ele alınması gerekir: C++ Java C# Ve JavaScript oysa içinde Python (toplam mod k öneki), bölenin işaretini aldığından her zaman negatif olmayan bir değerdir. k .
C++// C++ Code to Count Subarrays With Sum Divisible By K // using Prefix Sum and Hash map #include #include #include using namespace std; int subCount(vector<int> &arr int k) { int n = arr.size() res = 0; unordered_map<int int> prefCnt; int sum = 0; // Iterate over all ending points for(int i = 0; i < n; i++) { // prefix sum mod k (handling negative prefix sum) sum = ((sum + arr[i]) % k + k) % k; // If sum == 0 then increment the result by 1 // to count subarray arr[0...i] if(sum == 0) res += 1; // Add count of all starting points for index i res += prefCnt[sum]; prefCnt[sum] += 1; } return res; } int main() { vector<int> arr = {4 5 0 -2 -3 1}; int k = 5; cout << subCount(arr k); }
Java // Java Code to Count Subarrays With Sum Divisible By K // using Prefix Sum and Hash map import java.util.*; class GfG { static int subCount(int[] arr int k) { int n = arr.length res = 0; Map<Integer Integer> prefCnt = new HashMap<>(); int sum = 0; // Iterate over all ending points for (int i = 0; i < n; i++) { // prefix sum mod k (handling negative prefix sum) sum = ((sum + arr[i]) % k + k) % k; // If sum == 0 then increment the result by 1 // to count subarray arr[0...i] if (sum == 0) res += 1; // Add count of all starting points for index i res += prefCnt.getOrDefault(sum 0); prefCnt.put(sum prefCnt.getOrDefault(sum 0) + 1); } return res; } public static void main(String[] args) { int[] arr = {4 5 0 -2 -3 1}; int k = 5; System.out.println(subCount(arr k)); } }
Python # Python Code to Count Subarrays With Sum Divisible By K # using Prefix Sum and Dictionary from collections import defaultdict def subCount(arr k): n = len(arr) res = 0 prefCnt = defaultdict(int) sum = 0 # Iterate over all ending points for i in range(n): sum = (sum + arr[i]) % k # If sum == 0 then increment the result by 1 # to count subarray arr[0...i] if sum == 0: res += 1 # Add count of all starting points for index i res += prefCnt[sum] prefCnt[sum] += 1 return res if __name__ == '__main__': arr = [4 5 0 -2 -3 1] k = 5 print(subCount(arr k))
C# // C# Code to Count Subarrays With Sum Divisible By K // using Prefix Sum and Hash map using System; using System.Collections.Generic; class GfG { static int SubCount(int[] arr int k) { int n = arr.Length res = 0; Dictionary<int int> prefCnt = new Dictionary<int int>(); int sum = 0; // Iterate over all ending points for (int i = 0; i < n; i++) { // prefix sum mod k (handling negative prefix sum) sum = ((sum + arr[i]) % k + k) % k; // If sum == 0 then increment the result by 1 // to count subarray arr[0...i] if (sum == 0) res += 1; // Add count of all starting points for index i if (prefCnt.ContainsKey(sum)) res += prefCnt[sum]; if (prefCnt.ContainsKey(sum)) prefCnt[sum] += 1; else prefCnt[sum] = 1; } return res; } static void Main() { int[] arr = { 4 5 0 -2 -3 1 }; int k = 5; Console.WriteLine(SubCount(arr k)); } }
JavaScript // JavaScript Code to Count Subarrays With Sum Divisible By K // using Prefix Sum and Hash map function subCount(arr k) { let n = arr.length res = 0; let prefCnt = new Map(); let sum = 0; // Iterate over all ending points for (let i = 0; i < n; i++) { // prefix sum mod k (handling negative prefix sum) sum = ((sum + arr[i]) % k + k) % k; // If sum == 0 then increment the result by 1 // to count subarray arr[0...i] if (sum === 0) res += 1; // Add count of all starting points for index i res += (prefCnt.get(sum) || 0); prefCnt.set(sum (prefCnt.get(sum) || 0) + 1); } return res; } // Driver Code let arr = [4 5 0 -2 -3 1]; let k = 5; console.log(subCount(arr k));
Çıkış
7
Zaman Karmaşıklığı: O(n) dizi üzerinde yalnızca bir kez yineleme yaptığımız için.
Yardımcı Alan: O(min(n k)) en fazla k anahtarlar karma haritasında veya sözlükte mevcut olabilir.