Glede na matriko pozitivnih in negativnih celih števil je naloga izračunati vsoto najmanjših in največjih elementov vseh podmatrik velikosti k.
Primeri:
Vnos : arr[] = {2 5 -1 7 -3 -1 -2}
K = 4
Izhod : 18
Razlaga : Podmatri velikosti 4 so:
{2 5 -1 7} min + max = -1 + 7 = 6
{5 -1 7 -3} min + max = -3 + 7 = 4
{-1 7 -3 -1} min + max = -3 + 7 = 4
{7 -3 -1 -2} min + max = -3 + 7 = 4
Manjkajoča podmatrika -
{2 -1 7 -3}
{2 7 -3 -1}
{2 -3 -1 -2}
{5 7 -3 -1}
{5 -3 -1 -2}
in še nekaj -- zakaj teh niso upoštevali??
Ob upoštevanju manjkajočih nizov je rezultat 27
Vsota vseh najmanj in največ = 6 + 4 + 4 + 4 = 18
Ta problem je v glavnem razširitev spodnjega problema.
Največ vseh podnizov velikosti k
Naivni pristop:
C++Zaženite dve zanki, da ustvarite vse podnize in nato izberite vse podmatriže velikosti k ter poiščite največje in najmanjše vrednosti. Končno vrne vsoto vseh največjih in najmanjših elementov.
// C++ program to find sum of all minimum and maximum // elements Of Sub-array Size k. #include using namespace std; // Returns sum of min and max element of all subarrays // of size k int SumOfKsubArray(int arr[] int N int k) { // To store final answer int sum = 0; // Find all subarray for (int i = 0; i < N; i++) { // To store length of subarray int length = 0; for (int j = i; j < N; j++) { // Increment the length length++; // When there is subarray of size k if (length == k) { // To store maximum and minimum element int maxi = INT_MIN; int mini = INT_MAX; for (int m = i; m <= j; m++) { // Find maximum and minimum element maxi = max(maxi arr[m]); mini = min(mini arr[m]); } // Add maximum and minimum element in sum sum += maxi + mini; } } } return sum; } // Driver program to test above functions int main() { int arr[] = { 2 5 -1 7 -3 -1 -2 }; int N = sizeof(arr) / sizeof(arr[0]); int k = 4; cout << SumOfKsubArray(arr N k); return 0; }
Java // Java program to find sum of all minimum and maximum // elements Of Sub-array Size k. import java.util.Arrays; class GFG { // Returns sum of min and max element of all subarrays // of size k static int SumOfKsubArray(int[] arr int N int k) { // To store the final answer int sum = 0; // Find all subarrays for (int i = 0; i < N; i++) { // To store the length of the subarray int length = 0; for (int j = i; j < N; j++) { // Increment the length length++; // When there is a subarray of size k if (length == k) { // To store the maximum and minimum element int maxi = Integer.MIN_VALUE; int mini = Integer.MAX_VALUE; for (int m = i; m <= j; m++) { // Find the maximum and minimum element maxi = Math.max(maxi arr[m]); mini = Math.min(mini arr[m]); } // Add the maximum and minimum element to the sum sum += maxi + mini; } } } return sum; } // Driver program to test above functions public static void main(String[] args) { int[] arr = {2 5 -1 7 -3 -1 -2}; int N = arr.length; int k = 4; System.out.println(SumOfKsubArray(arr N k)); } } //This code is contributed by Vishal Dhaygude
Python # Returns sum of min and max element of all subarrays # of size k def sum_of_k_subarray(arr N k): # To store final answer sum = 0 # Find all subarrays for i in range(N): # To store length of subarray length = 0 for j in range(i N): # Increment the length length += 1 # When there is a subarray of size k if length == k: # To store maximum and minimum element maxi = float('-inf') mini = float('inf') for m in range(i j + 1): # Find maximum and minimum element maxi = max(maxi arr[m]) mini = min(mini arr[m]) # Add maximum and minimum element to sum sum += maxi + mini return sum # Driver program to test above function def main(): arr = [2 5 -1 7 -3 -1 -2] N = len(arr) k = 4 print(sum_of_k_subarray(arr N k)) if __name__ == '__main__': main()
C# using System; class Program { // Returns sum of min and max element of all subarrays // of size k static int SumOfKSubArray(int[] arr int N int k) { // To store the final answer int sum = 0; // Find all subarrays for (int i = 0; i < N; i++) { // To store the length of subarray int length = 0; for (int j = i; j < N; j++) { // Increment the length length++; // When there is a subarray of size k if (length == k) { // To store the maximum and minimum // element int maxi = int.MinValue; int mini = int.MaxValue; for (int m = i; m <= j; m++) { // Find maximum and minimum element maxi = Math.Max(maxi arr[m]); mini = Math.Min(mini arr[m]); } // Add maximum and minimum element in // sum sum += maxi + mini; } } } return sum; } // Driver program to test above functions static void Main() { int[] arr = { 2 5 -1 7 -3 -1 -2 }; int N = arr.Length; int k = 4; Console.WriteLine(SumOfKSubArray(arr N k)); } }
JavaScript // JavaScript program to find sum of all minimum and maximum // elements of sub-array size k. // Returns sum of min and max element of all subarrays // of size k function SumOfKsubArray(arr N k) { // To store final answer let sum = 0; // Find all subarray for (let i = 0; i < N; i++) { // To store length of subarray let length = 0; for (let j = i; j < N; j++) { // Increment the length length++; // When there is subarray of size k if (length === k) { // To store maximum and minimum element let maxi = Number.MIN_SAFE_INTEGER; let mini = Number.MAX_SAFE_INTEGER; for (let m = i; m <= j; m++) { // Find maximum and minimum element maxi = Math.max(maxi arr[m]); mini = Math.min(mini arr[m]); } // Add maximum and minimum element in sum sum += maxi + mini; } } } return sum; } // Driver program to test above function const arr = [2 5 -1 7 -3 -1 -2]; const N = arr.length; const k = 4; console.log(SumOfKsubArray(arr N k));
Izhod
18
Časovna zapletenost: O(N2*k), ker dve zanki za iskanje vseh podmatric in ena zanka za iskanje največjih in najmanjših elementov v podmatriki velikosti k
Pomožni prostor: O(1), ker ni bil uporabljen dodaten prostor
2. način (uporaba MultiSet):
Ideja je uporaba strukture podatkov Multiset in koncepta drsnega okna.
- Najprej ustvarimo a multiset para {numberindex}, ker bi nam indeks pomagal odstraniti element i in se premakniti na naslednje okno velikosti k .
- Drugič imamo i in j ki sta zadnji in sprednji kazalec, ki se uporabljata za vzdrževanje okna.
- Pojdite skozi matriko in vstavite v multiset par {numberindex} ter preverite tudi velikost okna, ko postane enaka k začnite s svojim primarnim ciljem, tj. najti vsoto največjih in najmanjših elementov.
- Nato izbrišite i-to številko indeksa iz niza in premaknite i-ti kazalec na naslednjo lokacijo, tj. novo okno velikosti k.
Izvedba:
C++// C++ program to find sum of all minimum and maximum // elements Of Sub-array Size k. #include using namespace std; // Returns sum of min and max element of all subarrays // of size k int SumOfKsubArray(int arr[] int n int k) { int sum = 0; // to store our final sum // multiset because nos. could be repeated // multiset pair is {numberindex} multiset<pair<int int> > ms; int i = 0; // back pointer int j = 0; // front pointer while (j < n && i < n) { ms.insert( { arr[j] j }); // inserting {numberindex} // front pointer - back pointer + 1 is for checking // window size int windowSize = j - i + 1; // Once they become equal start what we need to do if (windowSize == k) { // extracting first since set is always in // sorted ascending order int mini = ms.begin()->first; // extracting last element aka beginning from // last (numbers extraction) int maxi = ms.rbegin()->first; // adding summation of maximum & minimum element // of each subarray of k into final sum sum += (maxi + mini); // erasing the ith index element from set as it // won't appaer in next window of size k ms.erase({ arr[i] i }); // increasing back pointer for next window of // size k; i++; } j++; // always increments front pointer } return sum; } // Driver program to test above functions int main() { int arr[] = { 2 5 -1 7 -3 -1 -2 }; int n = sizeof(arr) / sizeof(arr[0]); int k = 4; cout << SumOfKsubArray(arr n k); return 0; }
Izhod
18
Časovna zahtevnost: O(nlogk)
Pomožni prostor: O(k)
3. način (učinkovita uporaba odstranitve iz čakalne vrste):
C++Ideja je uporaba podatkovne strukture Dequeue in koncepta drsnega okna. Ustvarimo dve prazni dvoslojni čakalni vrsti velikosti k ('S' 'G'), ki hranita le indekse elementov trenutnega okna, ki niso neuporabni. Element je neuporaben, če ne more biti maksimum ali minimum naslednjih podnizov.
// C++ program to find sum of all minimum and maximum // elements Of Sub-array Size k. #include using namespace std; // Returns sum of min and max element of all subarrays // of size k int SumOfKsubArray(int arr[] int n int k) { int sum = 0; // Initialize result // The queue will store indexes of useful elements // in every window // In deque 'G' we maintain decreasing order of // values from front to rear // In deque 'S' we maintain increasing order of // values from front to rear deque< int > S(k) G(k); // Process first window of size K int i = 0; for (i = 0; i < k; i++) { // Remove all previous greater elements // that are useless. while ( (!S.empty()) && arr[S.back()] >= arr[i]) S.pop_back(); // Remove from rear // Remove all previous smaller that are elements // are useless. while ( (!G.empty()) && arr[G.back()] <= arr[i]) G.pop_back(); // Remove from rear // Add current element at rear of both deque G.push_back(i); S.push_back(i); } // Process rest of the Array elements for ( ; i < n; i++ ) { // Element at the front of the deque 'G' & 'S' // is the largest and smallest // element of previous window respectively sum += arr[S.front()] + arr[G.front()]; // Remove all elements which are out of this // window if ( !S.empty() && S.front() == i - k) S.pop_front(); if ( !G.empty() && G.front() == i - k) G.pop_front(); // remove all previous greater element that are // useless while ( (!S.empty()) && arr[S.back()] >= arr[i]) S.pop_back(); // Remove from rear // remove all previous smaller that are elements // are useless while ( (!G.empty()) && arr[G.back()] <= arr[i]) G.pop_back(); // Remove from rear // Add current element at rear of both deque G.push_back(i); S.push_back(i); } // Sum of minimum and maximum element of last window sum += arr[S.front()] + arr[G.front()]; return sum; } // Driver program to test above functions int main() { int arr[] = {2 5 -1 7 -3 -1 -2} ; int n = sizeof(arr)/sizeof(arr[0]); int k = 4; cout << SumOfKsubArray(arr n k) ; return 0; }
Java // Java program to find sum of all minimum and maximum // elements Of Sub-array Size k. import java.util.Deque; import java.util.LinkedList; public class Geeks { // Returns sum of min and max element of all subarrays // of size k public static int SumOfKsubArray(int arr[] int k) { int sum = 0; // Initialize result // The queue will store indexes of useful elements // in every window // In deque 'G' we maintain decreasing order of // values from front to rear // In deque 'S' we maintain increasing order of // values from front to rear Deque<Integer> S=new LinkedList<>()G=new LinkedList<>(); // Process first window of size K int i = 0; for (i = 0; i < k; i++) { // Remove all previous greater elements // that are useless. while ( !S.isEmpty() && arr[S.peekLast()] >= arr[i]) S.removeLast(); // Remove from rear // Remove all previous smaller that are elements // are useless. while ( !G.isEmpty() && arr[G.peekLast()] <= arr[i]) G.removeLast(); // Remove from rear // Add current element at rear of both deque G.addLast(i); S.addLast(i); } // Process rest of the Array elements for ( ; i < arr.length; i++ ) { // Element at the front of the deque 'G' & 'S' // is the largest and smallest // element of previous window respectively sum += arr[S.peekFirst()] + arr[G.peekFirst()]; // Remove all elements which are out of this // window while ( !S.isEmpty() && S.peekFirst() <= i - k) S.removeFirst(); while ( !G.isEmpty() && G.peekFirst() <= i - k) G.removeFirst(); // remove all previous greater element that are // useless while ( !S.isEmpty() && arr[S.peekLast()] >= arr[i]) S.removeLast(); // Remove from rear // remove all previous smaller that are elements // are useless while ( !G.isEmpty() && arr[G.peekLast()] <= arr[i]) G.removeLast(); // Remove from rear // Add current element at rear of both deque G.addLast(i); S.addLast(i); } // Sum of minimum and maximum element of last window sum += arr[S.peekFirst()] + arr[G.peekFirst()]; return sum; } public static void main(String args[]) { int arr[] = {2 5 -1 7 -3 -1 -2} ; int k = 4; System.out.println(SumOfKsubArray(arr k)); } } //This code is contributed by Gaurav Tiwari
Python # Python3 program to find Sum of all minimum and maximum # elements Of Sub-array Size k. from collections import deque # Returns Sum of min and max element of all subarrays # of size k def SumOfKsubArray(arr n k): Sum = 0 # Initialize result # The queue will store indexes of useful elements # in every window # In deque 'G' we maintain decreasing order of # values from front to rear # In deque 'S' we maintain increasing order of # values from front to rear S = deque() G = deque() # Process first window of size K for i in range(k): # Remove all previous greater elements # that are useless. while ( len(S) > 0 and arr[S[-1]] >= arr[i]): S.pop() # Remove from rear # Remove all previous smaller that are elements # are useless. while ( len(G) > 0 and arr[G[-1]] <= arr[i]): G.pop() # Remove from rear # Add current element at rear of both deque G.append(i) S.append(i) # Process rest of the Array elements for i in range(k n): # Element at the front of the deque 'G' & 'S' # is the largest and smallest # element of previous window respectively Sum += arr[S[0]] + arr[G[0]] # Remove all elements which are out of this # window while ( len(S) > 0 and S[0] <= i - k): S.popleft() while ( len(G) > 0 and G[0] <= i - k): G.popleft() # remove all previous greater element that are # useless while ( len(S) > 0 and arr[S[-1]] >= arr[i]): S.pop() # Remove from rear # remove all previous smaller that are elements # are useless while ( len(G) > 0 and arr[G[-1]] <= arr[i]): G.pop() # Remove from rear # Add current element at rear of both deque G.append(i) S.append(i) # Sum of minimum and maximum element of last window Sum += arr[S[0]] + arr[G[0]] return Sum # Driver program to test above functions arr=[2 5 -1 7 -3 -1 -2] n = len(arr) k = 4 print(SumOfKsubArray(arr n k)) # This code is contributed by mohit kumar
C# // C# program to find sum of all minimum and maximum // elements Of Sub-array Size k. using System; using System.Collections.Generic; class Geeks { // Returns sum of min and max element of all subarrays // of size k public static int SumOfKsubArray(int []arr int k) { int sum = 0; // Initialize result // The queue will store indexes of useful elements // in every window // In deque 'G' we maintain decreasing order of // values from front to rear // In deque 'S' we maintain increasing order of // values from front to rear List<int> S = new List<int>(); List<int> G = new List<int>(); // Process first window of size K int i = 0; for (i = 0; i < k; i++) { // Remove all previous greater elements // that are useless. while ( S.Count != 0 && arr[S[S.Count - 1]] >= arr[i]) S.RemoveAt(S.Count - 1); // Remove from rear // Remove all previous smaller that are elements // are useless. while ( G.Count != 0 && arr[G[G.Count - 1]] <= arr[i]) G.RemoveAt(G.Count - 1); // Remove from rear // Add current element at rear of both deque G.Add(i); S.Add(i); } // Process rest of the Array elements for ( ; i < arr.Length; i++ ) { // Element at the front of the deque 'G' & 'S' // is the largest and smallest // element of previous window respectively sum += arr[S[0]] + arr[G[0]]; // Remove all elements which are out of this // window while ( S.Count != 0 && S[0] <= i - k) S.RemoveAt(0); while ( G.Count != 0 && G[0] <= i - k) G.RemoveAt(0); // remove all previous greater element that are // useless while ( S.Count != 0 && arr[S[S.Count-1]] >= arr[i]) S.RemoveAt(S.Count - 1 ); // Remove from rear // remove all previous smaller that are elements // are useless while ( G.Count != 0 && arr[G[G.Count - 1]] <= arr[i]) G.RemoveAt(G.Count - 1); // Remove from rear // Add current element at rear of both deque G.Add(i); S.Add(i); } // Sum of minimum and maximum element of last window sum += arr[S[0]] + arr[G[0]]; return sum; } // Driver code public static void Main(String []args) { int []arr = {2 5 -1 7 -3 -1 -2} ; int k = 4; Console.WriteLine(SumOfKsubArray(arr k)); } } // This code is contributed by gauravrajput1
JavaScript // JavaScript program to find sum of all minimum and maximum // elements Of Sub-array Size k. // Returns sum of min and max element of all subarrays // of size k function SumOfKsubArray(arr k) { let sum = 0; // Initialize result // The queue will store indexes of useful elements // in every window // In deque 'G' we maintain decreasing order of // values from front to rear // In deque 'S' we maintain increasing order of // values from front to rear let S = []; let G = []; // Process first window of size K let i = 0; for (i = 0; i < k; i++) { // Remove all previous greater elements // that are useless. while ( S.length != 0 && arr[S[S.length - 1]] >= arr[i]) S.pop(); // Remove from rear // Remove all previous smaller that are elements // are useless. while ( G.length != 0 && arr[G[G.length - 1]] <= arr[i]) G.pop(); // Remove from rear // Add current element at rear of both deque G.push(i); S.push(i); } // Process rest of the Array elements for ( ; i < arr.length; i++ ) { // Element at the front of the deque 'G' & 'S' // is the largest and smallest // element of previous window respectively sum += arr[S[0]] + arr[G[0]]; // Remove all elements which are out of this // window while ( S.length != 0 && S[0] <= i - k) S.shift(0); while ( G.length != 0 && G[0] <= i - k) G.shift(0); // remove all previous greater element that are // useless while ( S.length != 0 && arr[S[S.length-1]] >= arr[i]) S.pop(); // Remove from rear // remove all previous smaller that are elements // are useless while ( G.length != 0 && arr[G[G.length - 1]] <= arr[i]) G.pop(); // Remove from rear // Add current element at rear of both deque G.push(i); S.push(i); } // Sum of minimum and maximum element of last window sum += arr[S[0]] + arr[G[0]]; return sum; } // Driver code let arr = [2 5 -1 7 -3 -1 -2]; let k = 4; console.log(SumOfKsubArray(arr k)); // This code is contributed by _saurabh_jaiswal
Izhod
18
Časovna zahtevnost: O(n)
Pomožni prostor: O(k)