logo

Vsota min in max vseh podnizov velikosti k.

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:

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++
// 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):

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++
// 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)

Ustvari kviz