Givet en række af n elementer og et heltal k . Opgaven er at finde antallet af underarrayet, som har et maksimalt element større end K.
Eksempler:
Input : arr[] = {1 2 3} and k = 2.Recommended Practice Antal undergrupper Prøv det!
Output : 3
All the possible subarrays of arr[] are
{ 1 } { 2 } { 3 } { 1 2 } { 2 3 }
{ 1 2 3 }.
Their maximum elements are 1 2 3 2 3 3.
There are only 3 maximum elements > 2.
Fremgangsmåde 1: Optælling af subarrays med max element<= K and then subtracting from total subarrays.
Ideen er at nærme sig problemet ved at tælle subarrays, hvis maksimale element er mindre end eller lig med k, da det er lettere at tælle sådanne subarrays. For at finde antallet af underarray, hvis maksimale element er mindre end eller lig med k, fjern alt det element, der er større end K, og find antallet af underarray med de venstre elementer.
Når vi har fundet ovenstående tal, kan vi trække det fra n*(n+1)/2 for at få vores ønskede resultat. Bemærk, at der kan være n*(n+1)/2 mulige antal underarrays af enhver array af størrelse n. Så ved at finde antallet af subarray, hvis maksimale element er mindre end eller lig med K og trække det fra n*(n+1)/2, får vi svaret.
Nedenfor er implementeringen af denne tilgang:
C++// C++ program to count number of subarrays // whose maximum element is greater than K. #include using namespace std; // Return number of subarrays whose maximum // element is less than or equal to K. int countSubarray(int arr[] int n int k) { // To store count of subarrays with all // elements less than or equal to k. int s = 0; // Traversing the array. int i = 0; while (i < n) { // If element is greater than k ignore. if (arr[i] > k) { i++; continue; } // Counting the subarray length whose // each element is less than equal to k. int count = 0; while (i < n && arr[i] <= k) { i++; count++; } // Summing number of subarray whose // maximum element is less than equal to k. s += ((count * (count + 1)) / 2); } return (n * (n + 1) / 2 - s); } // Driven Program int main() { int arr[] = { 1 2 3 }; int k = 2; int n = sizeof(arr) / sizeof(arr[0]); cout << countSubarray(arr n k); return 0; }
Java // Java program to count number of subarrays // whose maximum element is greater than K. import java.util.*; class GFG { // Return number of subarrays whose maximum // element is less than or equal to K. static int countSubarray(int arr[] int n int k) { // To store count of subarrays with all // elements less than or equal to k. int s = 0; // Traversing the array. int i = 0; while (i < n) { // If element is greater than k ignore. if (arr[i] > k) { i++; continue; } // Counting the subarray length whose // each element is less than equal to k. int count = 0; while (i < n && arr[i] <= k) { i++; count++; } // Summing number of subarray whose // maximum element is less than equal to k. s += ((count * (count + 1)) / 2); } return (n * (n + 1) / 2 - s); } // Driver code public static void main(String[] args) { int arr[] = { 1 2 3 }; int k = 2; int n = arr.length; System.out.print(countSubarray(arr n k)); } } // This code is contributed by Anant Agarwal.
Python3 # Python program to count # number of subarrays # whose maximum element # is greater than K. # Return number of # subarrays whose maximum # element is less than or equal to K. def countSubarray(arr n k): # To store count of # subarrays with all # elements less than # or equal to k. s = 0 # Traversing the array. i = 0 while (i < n): # If element is greater # than k ignore. if (arr[i] > k): i = i + 1 continue # Counting the subarray # length whose # each element is less # than equal to k. count = 0 while (i < n and arr[i] <= k): i = i + 1 count = count + 1 # Summing number of subarray whose # maximum element is less # than equal to k. s = s + ((count*(count + 1))//2) return (n*(n + 1)//2 - s) # Driver code arr = [1 2 3] k = 2 n = len(arr) print(countSubarray(arr n k)) # This code is contributed # by Anant Agarwal.
C# // C# program to count number of subarrays // whose maximum element is greater than K. using System; class GFG { // Return number of subarrays whose maximum // element is less than or equal to K. static int countSubarray(int[] arr int n int k) { // To store count of subarrays with all // elements less than or equal to k. int s = 0; // Traversing the array. int i = 0; while (i < n) { // If element is greater than k ignore. if (arr[i] > k) { i++; continue; } // Counting the subarray length whose // each element is less than equal to k. int count = 0; while (i < n && arr[i] <= k) { i++; count++; } // Summing number of subarray whose // maximum element is less than equal to k. s += ((count * (count + 1)) / 2); } return (n * (n + 1) / 2 - s); } // Driver code public static void Main() { int[] arr = {1 2 3}; int k = 2; int n = arr.Length; Console.WriteLine(countSubarray(arr n k)); } } // This code is contributed by vt_m.
JavaScript <script> // Javascript program to count number of subarrays // whose maximum element is greater than K. // Return number of subarrays whose maximum // element is less than or equal to K. function countSubarray(arr n k) { // To store count of subarrays with all // elements less than or equal to k. let s = 0; // Traversing the array. let i = 0; while (i < n) { // If element is greater than k ignore. if (arr[i] > k) { i++; continue; } // Counting the subarray length whose // each element is less than equal to k. let count = 0; while (i < n && arr[i] <= k) { i++; count++; } // Summing number of subarray whose // maximum element is less than equal to k. s += parseInt((count * (count + 1)) / 2 10); } return (n * parseInt((n + 1) / 2 10) - s); } let arr = [1 2 3]; let k = 2; let n = arr.length; document.write(countSubarray(arr n k)); </script>
PHP // PHP program to count number of subarrays // whose maximum element is greater than K. // Return number of subarrays whose maximum // element is less than or equal to K. function countSubarray( $arr $n $k) { // To store count of subarrays with all // elements less than or equal to k. $s = 0; // Traversing the array. $i = 0; while ($i < $n) { // If element is greater than k // ignore. if ($arr[$i] > $k) { $i++; continue; } // Counting the subarray length // whose each element is less // than equal to k. $count = 0; while ($i < $n and $arr[$i] <= $k) { $i++; $count++; } // Summing number of subarray whose // maximum element is less than // equal to k. $s += (($count * ($count + 1)) / 2); } return ($n * ($n + 1) / 2 - $s); } // Driven Program $arr = array( 1 2 3 ); $k = 2; $n = count($arr); echo countSubarray($arr $n $k); // This code is contributed by anuj_67. ?> Produktion
3
Tidskompleksitet: O(n).
Hjælpeplads: O(1)
Fremgangsmåde 2: Optælling af subarrays med max element > K
I denne tilgang finder vi simpelthen antallet af subarrays, der kan dannes ved at inkludere et element ved indeks i, som er større end K. arr [i] > K så vil alle underarrays, hvori dette element er til stede, have en værdi, der er større end k, så vi beregner bare alle disse underarrays for hvert element, der er større end K og tilføjer dem som svar. Vi initialiserer først to variable år = 0 dette indeholder svar og forrige = -1 dette holder styr på indekset for tidligere element, der var større end K.
For at gøre dette skal vi blot bruge tre værdier for hver arr [i] > K.
- Antal underarrays startende fra indekset jeg . Dette vil være (N-i) . BEMÆRK: I dette har vi inkluderet underarrayet, der indeholder et enkelt element, som er selve dette element. { arr [i] }
- Antal underarrays, der slutter ved dette indeks jeg men startindekset for disse subarrays er efter indekset forrige af tidligere element, der var større end K, hvorfor gør vi dette? Fordi for disse elementer skal vi allerede have beregnet vores svar, så vi ønsker ikke at tælle de samme subarrays mere end én gang. Så denne værdi kommer til at blive ( i - forrige - 1) . BEMÆRK: I denne trækker vi 1 fra, fordi vi allerede har talt en undermatrix { arr [ i ] } med sig selv som enkelt element. Se ovenstående punktnote.
- Antal underarrays med startindeks mindre end jeg men større end forrige og slutindeks større end jeg . Derfor alle underarrays, hvor arr[i] er imellem. Dette kan vi beregne ved at gange over to værdier. Lad os sige dem som L = ( N - i - 1 ) og R = (i - forrige -1). Nu gange vi bare disse L og R, fordi for hver 1 indeks på venstre side af i er der R-indeks, der kan gøre forskellige underarrays til grundlæggende matematik ting. Så dette bliver L * R . Bemærk her i val af L har vi faktisk trukket 1 fra, hvis vi ikke gør dette, så inkluderer vi indeks i i vores L*R, hvilket vil betyde, at vi har inkluderet nummer 1 type subarrays igen. Se punkt 1.
Nedenfor er implementeringen af denne tilgang:
C++// C++ program to count number of subarrays // whose maximum element is greater than K. #include using namespace std; long long countSubarray(int arr[] int n int k) { long long ans = 0 ; int prev = - 1; //prev for keeping track of index of previous element > k; for(int i = 0 ; i < n ; i++ ) { if ( arr [ i ] > k ) { ans += n - i ; //subarrays starting at index i. ans += i - prev - 1 ; //subarrays ending at index i but starting after prev. ans += ( n - i - 1 ) * 1LL * ( i - prev - 1 ) ; //subarrays having index i element in between. prev = i; // updating prev } } return ans; } // Driven Program int main() { int arr[] = { 4 5 1 2 3 }; int k = 2; int n = sizeof(arr) / sizeof(arr[0]); cout << countSubarray(arr n k); return 0; } // This Code is contributed by Manjeet Singh.
Java // Java program to count number of subarrays // whose maximum element is greater than K. import java.util.*; public class GFG { static long countSubarray(int arr[] int n int k) { long ans = 0 ; int prev = - 1; //prev for keeping track of index of previous element > k; for(int i = 0 ; i < n ; i++ ) { if ( arr [ i ] > k ) { ans += n - i ; //subarrays starting at index i. ans += i - prev - 1 ; //subarrays ending at index i but starting after prev. ans += ( n - i - 1 ) * 1L * ( i - prev - 1 ) ; //subarrays having index i element in between. prev = i; // updating prev } } return ans; } // Driver code public static void main(String[] args) { int arr[] = { 4 5 1 2 3 }; int k = 2; int n = arr.length; System.out.print(countSubarray(arr n k)); } } //This Code is contributed by Manjeet Singh
Python3 # Python program to count number of subarrays # whose maximum element is greater than K. def countSubarray( arr n k): ans = 0 ; prev = - 1; #prev for keeping track of index of previous element > k; for i in range(0n): if ( arr [ i ] > k ) : ans += n - i ; #subarrays starting at index i. ans += i - prev - 1 ; #subarrays ending at index i but starting after prev. ans += ( n - i - 1 ) * ( i - prev - 1 ) ; #subarrays having index i element in between. prev = i; # updating prev return ans; # Driven Program arr = [ 4 5 1 2 3 ]; k = 2; n = len(arr); print(countSubarray(arr n k)); # this code is contributed by poojaagarwal2.
C# // C# program to count number of subarrays // whose maximum element is greater than K. using System; public class GFG { static long countSubarray(int[] arr int n int k) { long ans = 0; int prev = -1; // prev for keeping track of index of // previous element > k; for (int i = 0; i < n; i++) { if (arr[i] > k) { ans += n - i; // subarrays starting at index // i. ans += i - prev - 1; // subarrays ending at index i // but starting after prev. ans += (n - i - 1) * (long)1 * (i - prev - 1); // subarrays having index i // element in between. prev = i; // updating prev } } return ans; } // Driver code public static void Main(string[] args) { int[] arr = { 4 5 1 2 3 }; int k = 2; int n = arr.Length; Console.Write(countSubarray(arr n k)); } } // This Code is contributed by Karandeep1234
JavaScript // Javascript program to count number of subarrays // whose maximum element is greater than K. function countSubarray(arr n k) { let ans = 0 ; //prev for keeping track of index of previous element > k; let prev = - 1; for(let i = 0 ; i < n ; i++ ) { if ( arr [ i ] > k ) { //subarrays starting at index i. ans += n - i ; //subarrays ending at index i but starting after prev. ans += i - prev - 1 ; //subarrays having index i element in between. ans += ( n - i - 1 ) * 1 * ( i - prev - 1 ) ; // updating prev prev = i; } } return ans; } // Driven Program let arr = [ 4 5 1 2 3 ]; let k = 2; let n = arr.length; document.write(countSubarray(arr n k));
Produktion
12
Tidskompleksitet: O(n).
Fremgangsmåde 3: Skydevindueteknik.
Algoritme:
1. Initialiser en variabel år = 0 en variabel maxElement = 0 og en variabel antal = 0 .
2. Gentag gennem arrayet og gør følgende for hvert element:
en. Hvis det nuværende element dvs. arr[i] er større end aktuel maksimal opdatering den maksimale dvs. Radioen = arr ] og nulstil tælleren til 0.
b. Hvis det aktuelle element er mindre end eller eual til det aktuelle maksimum, så øg tælleren.
c. Hvis maxElement er grteater end k da tilføje tæller af subarrays til endeligt svar og opdatere maxElement til nuværende element.
3. Returner endeligt svar.
Her er implementeringen af glidende vinduesteknik.
C++#include using namespace std; int countSubarray(int arr[] int n int k) { int maxElement = 0 count = 0 ans = 0; for(int i=0; i<n; i++) { if(arr[i] > maxElement) { maxElement = arr[i]; count = 0; } else { count++; } if(maxElement > k) { ans += (i - count + 1); maxElement = arr[i]; count = 0; } } return ans; } int main() { int arr[] = {1 2 3 4}; int k = 1; int n = sizeof(arr) / sizeof(arr[0]); cout << countSubarray(arr n k); return 0; } // This code is contributed by Vaibhav Saroj
C #include int countSubarray(int arr[] int n int k) { int maxElement = 0 count = 0 ans = 0; for(int i=0; i<n; i++) { if(arr[i] > maxElement) { maxElement = arr[i]; count = 0; } else { count++; } if(maxElement > k) { ans += (i - count + 1); maxElement = arr[i]; count = 0; } } ans += (count * (count + 1)) / 2; return ans; } int main() { int arr[] = {1 2 3 4}; int k = 1; int n = sizeof(arr) / sizeof(arr[0]); printf('%dn' countSubarray(arr n k)); return 0; } // This code is contributed by Vaibhav Saroj
Java import java.util.*; public class GFG { // Function to count the number of subarrays with the maximum element greater than k public static int countSubarray(int[] arr int n int k) { int maxElement = 0; // Variable to store the maximum element encountered so far int count = 0; // Variable to count the length of the subarray with elements <= k int ans = 0; // Variable to store the final result for (int i = 0; i < n; i++) { if (arr[i] > maxElement) { // If the current element is greater than the maximum element // update the maximum element and reset the count to zero. maxElement = arr[i]; count = 0; } else { // increment the count count++; } if (maxElement > k) { // If the maximum element in the current subarray is greater than k // add the count of subarrays ending at the current index (i - count + 1) to the result. ans += (i - count + 1); // Reset the maximum element and count to zero. maxElement = arr[i]; count = 0; } } // Return the final result return ans; } public static void main(String[] args) { int[] arr = {1 2 3 4}; int k = 1; int n = arr.length; // Call the countSubarray function to count the number of subarrays with maximum element greater than k int result = countSubarray(arr n k); System.out.println(result); } } // THIS CODE IS CONTRIBUTED BY KIRTI AGARWAL
Python3 def countSubarray(arr n k): maxElement count ans = 0 0 0 for i in range(n): if arr[i] > maxElement: maxElement = arr[i] count = 0 else: count += 1 if maxElement > k: ans += (i - count + 1) maxElement = arr[i] count = 0 ans += (count * (count + 1)) // 2 return ans arr = [1 2 3 4] k = 1 n = len(arr) print(countSubarray(arr n k)) # This code is contributed by Vaibhav Saroj
C# using System; public class Program { public static int CountSubarray(int[] arr int n int k) { int maxElement = 0 count = 0 ans = 0; for(int i=0; i<n; i++) { if(arr[i] > maxElement) { maxElement = arr[i]; count = 0; } else { count++; } if(maxElement > k) { ans += (i - count + 1); maxElement = arr[i]; count = 0; } } ans += (count * (count + 1)) / 2; return ans; } public static void Main() { int[] arr = {1 2 3 4}; int k = 1; int n = arr.Length; Console.WriteLine(CountSubarray(arr n k)); } } // This code is contributed by Vaibhav Saroj
JavaScript function countSubarray(arr n k) { let maxElement = 0 count = 0 ans = 0; for(let i=0; i<n; i++) { if(arr[i] > maxElement) { maxElement = arr[i]; count = 0; } else { count++; } if(maxElement > k) { ans += (i - count + 1); maxElement = arr[i]; count = 0; } } ans += (count * (count + 1)) / 2; return ans; } let arr = [1 2 3 4]; let k = 1; let n = arr.length; console.log(countSubarray(arr n k)); // This code is contributed by Vaibhav Saroj
Produktion
9
Sliding Window Technique er bidraget af Vaibhav Saroj .
Tidskompleksitet: O( n ).
Rumkompleksitet: O( 1 ).