Gegeven een array van N elementen en een geheel getal k . De taak is om de telling van de subarray te vinden die een maximaal element groter dan K heeft.
Voorbeelden:
Input : arr[] = {1 2 3} and k = 2.Recommended Practice Aantal subarrays Probeer het!
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.
Benadering 1: Subarrays tellen met maximaal element<= K and then subtracting from total subarrays.
Het idee is om het probleem te benaderen door subarrays te tellen waarvan het maximale element kleiner is dan of gelijk is aan k, omdat het tellen van dergelijke subarrays eenvoudiger is. Om het aantal subarrays te vinden waarvan het maximale element kleiner is dan of gelijk is aan k, verwijdert u al het element dat groter is dan K en vindt u het aantal subarrays met de linkerelementen.
Zodra we bovenstaande telling hebben gevonden, kunnen we deze aftrekken van n*(n+1)/2 om het gewenste resultaat te krijgen. Merk op dat er n*(n+1)/2 mogelijke subarrays kunnen zijn van elke array met grootte n. Dus als we het aantal subarrays vinden waarvan het maximale element kleiner is dan of gelijk is aan K en dit aftrekken van n*(n+1)/2, krijgen we het antwoord.
Hieronder vindt u de implementatie van deze aanpak:
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. ?> Uitvoer
3
Tijdcomplexiteit: O(n).
Hulpruimte: O(1)
Benadering 2: Subarrays tellen met max. element > K
In deze benadering vinden we eenvoudigweg het aantal subarrays dat kan worden gevormd door een element op te nemen in index i dat groter is dan K. Dus als we aannemen dat arr [ ik ] > K dan zullen alle subarrays waarin dit element aanwezig is een waarde hebben die groter is dan k, dus berekenen we al deze subarrays voor elk element dat groter is dan K en tellen ze als antwoord op. We initialiseren eerst twee variabelen jaar = 0 dit bevat antwoord en vorige = -1 dit houdt de index bij van het vorige element dat groter was dan K.
Om dit te doen hebben we slechts drie waarden nodig voor elke arr [ i ] > K .
- Aantal subarrays vanaf de index i . Dit zal zijn ( N - ik ) . OPMERKING: Hierin hebben we de subarray opgenomen die één element bevat dat dit element zelf is. { arr [ ik ] }
- Aantal subarrays eindigend op deze index i maar de startindex van deze subarrays bevindt zich na de index vorige van het vorige element dat groter was dan K, waarom doen we dit? Omdat we voor die elementen ons antwoord al moeten hebben berekend, dus we willen dezelfde subarrays niet meer dan één keer tellen. Deze waarde zal dus werkelijkheid worden ( ik - vorige - 1 ) . OPMERKING: Hierbij trekken we 1 af omdat we al een subarray { arr [ i ] } hebben geteld die zichzelf als enkel element heeft. Zie bovenstaande puntopmerking.
- Aantal subarrays met een startindex kleiner dan i maar groter dan vorige en eindindex groter dan i . Dus alle subarrays waarin arr[i] ertussen zit. Dit kunnen we berekenen door bovenstaande twee waarden te vermenigvuldigen. Laten we ze zeggen als L = ( N - ik - 1 ) En R = ( ik - vorige -1 ). Nu vermenigvuldigen we deze L en R gewoon, omdat voor elke 1-index aan de linkerkant van i er een R-index is die verschillende subarrays tot basiswiskunde kan maken. Dit wordt dus L*R. Merk op dat we hier in val van L feitelijk 1 hebben afgetrokken. Als we dit niet doen, nemen we index i op in onze L*R, wat betekent dat we opnieuw subarrays van het type nummer 1 hebben opgenomen. Zie punt 1.
Hieronder vindt u de implementatie van deze aanpak:
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));
Uitvoer
12
Tijdcomplexiteit: O(n).
Benadering 3: Schuifraamtechniek.
Algoritme:
1. Initialiseer een variabele jaar = 0 een variabele maxElement = 0 en een variabele tel = 0 .
2. Doorloop de array en doe voor elk element het volgende:
A. Als het huidige element, d.w.z. arr[ ik ] is groter dan het huidige maximum, update het maximum, d.w.z. De radio = arr ] en zet de teller terug op 0.
B. Als het huidige element kleiner is dan of gelijk is aan het huidige maximum, verhoog dan de telling.
C. Als maxElement is dan groter dan k tel toevoegen van subarrays naar het definitieve antwoord en update het maxElement naar het huidige element.
3. Terug Eindantwoord.
Hier is de implementatie van de schuifraamtechniek.
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
Uitvoer
9
De Sliding Window Technique wordt bijgedragen door Vaibhav Saroj .
Tijdcomplexiteit: O( n ).
Ruimtecomplexiteit: O( 1 ).