logo

Maximal summa av par med specifik skillnad

Prova det på GfG Practice ' title= #practiceLinkDiv { display: ingen !viktigt; }

Givet en matris med heltal och ett tal k. Vi kan para ihop två nummer i matrisen om skillnaden mellan dem är strikt mindre än k. Uppgiften är att hitta den maximala möjliga summan av disjunkta par. Summan av P-par är summan av alla 2P-antal av par.

a-b beskärning

Exempel:

Inmatning  : arr[] = {3 5 10 15 17 12 9} K = 4
Utgång: 62
Förklaring:
Då är osammanhängande par med skillnad mindre än K (3 5) (10 12) (15 17)  
Så den maximala summan vi kan få är 3 + 5 + 12 + 10 + 15 + 17 = 62
Observera att ett alternativt sätt att bilda disjunkta par är (3 5) (9 12) (15 17) men denna parning ger mindre summa.



Inmatning  : arr[] = {5 15 10 300} k = 12
Utgång: 25

Rekommenderad praxis Par med specifik skillnad Prova det!

Närma sig: Först sorterar vi den givna matrisen i ökande ordning. När arrayen är sorterad passerar vi arrayen. För varje element försöker vi först para ihop det med dess tidigare element. Varför föredrar vi tidigare element? Låt arr[i] kan paras ihop med arr[i-1] och arr[i-2] (dvs. arr[i] – arr[i-1]< K and arr[i]-arr[i-2] < K). Since the array is sorted value of arr[i-1] would be more than arr[i-2]. Also we need to pair with difference less than k it means if arr[i-2] can be paired then arr[i-1] can also be paired in a sorted array. 

primitiva datatyper i java

När vi nu observerar ovanstående fakta kan vi formulera vår dynamiska programmeringslösning enligt nedan 

Låt dp[i] betecknar den maximala disjunkta parsumman som vi kan uppnå genom att använda första i-elementen i arrayen. Anta att vi för närvarande är på i'th position så finns det två möjligheter för oss. 

 Pair up i with (i-1)th element i.e. dp[i] = dp[i-2] + arr[i] + arr[i-1] Don't pair up i.e. dp[i] = dp[i-1] 

Ovan iteration tar O(N) tid och sortering av array kommer att ta O(N log N) tid så den totala tidskomplexiteten för lösningen blir O(N log N) 

Genomförande:

C++
// C++ program to find maximum pair sum whose // difference is less than K #include    using namespace std; // method to return maximum sum we can get by // finding less than K difference pair int maxSumPairWithDifferenceLessThanK(int arr[] int N int K) {  // Sort input array in ascending order.  sort(arr arr+N);  // dp[i] denotes the maximum disjoint pair sum  // we can achieve using first i elements  int dp[N];  // if no element then dp value will be 0  dp[0] = 0;  for (int i = 1; i < N; i++)  {  // first give previous value to dp[i] i.e.  // no pairing with (i-1)th element  dp[i] = dp[i-1];  // if current and previous element can form a pair  if (arr[i] - arr[i-1] < K)  {  // update dp[i] by choosing maximum between  // pairing and not pairing  if (i >= 2)  dp[i] = max(dp[i] dp[i-2] + arr[i] + arr[i-1]);  else  dp[i] = max(dp[i] arr[i] + arr[i-1]);  }  }  // last index will have the result  return dp[N - 1]; } // Driver code to test above methods int main() {  int arr[] = {3 5 10 15 17 12 9};  int N = sizeof(arr)/sizeof(int);  int K = 4;  cout << maxSumPairWithDifferenceLessThanK(arr N K);  return 0; } 
Java
// Java program to find maximum pair sum whose // difference is less than K import java.io.*; import java.util.*; class GFG {    // method to return maximum sum we can get by  // finding less than K difference pair  static int maxSumPairWithDifferenceLessThanK(int arr[]  int N int K)  {    // Sort input array in ascending order.  Arrays.sort(arr);    // dp[i] denotes the maximum disjoint pair sum  // we can achieve using first i elements  int dp[] = new int[N];    // if no element then dp value will be 0  dp[0] = 0;    for (int i = 1; i < N; i++)  {  // first give previous value to dp[i] i.e.  // no pairing with (i-1)th element  dp[i] = dp[i-1];    // if current and previous element can form a pair  if (arr[i] - arr[i-1] < K)  {    // update dp[i] by choosing maximum between  // pairing and not pairing  if (i >= 2)  dp[i] = Math.max(dp[i] dp[i-2] + arr[i] +  arr[i-1]);  else  dp[i] = Math.max(dp[i] arr[i] + arr[i-1]);  }  }    // last index will have the result  return dp[N - 1];  }  // Driver code to test above methods  public static void main (String[] args) {    int arr[] = {3 5 10 15 17 12 9};  int N = arr.length;  int K = 4;    System.out.println ( maxSumPairWithDifferenceLessThanK(  arr N K));    } } //This code is contributed by vt_m. 
Python3
# Python3 program to find maximum pair  # sum whose difference is less than K # method to return maximum sum we can  # get by get by finding less than K # difference pair def maxSumPairWithDifferenceLessThanK(arr N K): # Sort input array in ascending order. arr.sort() # dp[i] denotes the maximum disjoint # pair sum we can achieve using first # i elements dp = [0] * N # if no element then dp value will be 0 dp[0] = 0 for i in range(1 N): # first give previous value to # dp[i] i.e. no pairing with # (i-1)th element dp[i] = dp[i-1] # if current and previous element  # can form a pair if (arr[i] - arr[i-1] < K): # update dp[i] by choosing # maximum between pairing # and not pairing if (i >= 2): dp[i] = max(dp[i] dp[i-2] + arr[i] + arr[i-1]); else: dp[i] = max(dp[i] arr[i] + arr[i-1]); # last index will have the result return dp[N - 1] # Driver code to test above methods arr = [3 5 10 15 17 12 9] N = len(arr) K = 4 print(maxSumPairWithDifferenceLessThanK(arr N K)) # This code is contributed by Smitha Dinesh Semwal 
C#
// C# program to find maximum pair sum whose // difference is less than K using System; class GFG {    // method to return maximum sum we can get by  // finding less than K difference pair  static int maxSumPairWithDifferenceLessThanK(int []arr  int N int K)  {    // Sort input array in ascending order.  Array.Sort(arr);    // dp[i] denotes the maximum disjoint pair sum  // we can achieve using first i elements  int []dp = new int[N];    // if no element then dp value will be 0  dp[0] = 0;    for (int i = 1; i < N; i++)  {  // first give previous value to dp[i] i.e.  // no pairing with (i-1)th element  dp[i] = dp[i-1];    // if current and previous element can form   // a pair  if (arr[i] - arr[i-1] < K)  {    // update dp[i] by choosing maximum   // between pairing and not pairing  if (i >= 2)  dp[i] = Math.Max(dp[i] dp[i-2]   + arr[i] + arr[i-1]);  else  dp[i] = Math.Max(dp[i] arr[i]  + arr[i-1]);  }  }    // last index will have the result  return dp[N - 1];  }  // Driver code to test above methods  public static void Main () {    int []arr = {3 5 10 15 17 12 9};  int N = arr.Length;  int K = 4;    Console.WriteLine(   maxSumPairWithDifferenceLessThanK(arr N K));    } } // This code is contributed by anuj_67. 
PHP
 // Php program to find maximum pair sum whose  // difference is less than K  // method to return maximum sum we can get by  // finding less than K difference pair  function maxSumPairWithDifferenceLessThanK($arr $N $K) { // Sort input array in ascending order.  sort($arr) ; // dp[i] denotes the maximum disjoint pair sum  // we can achieve using first i elements  $dp = array() ; // if no element then dp value will be 0  $dp[0] = 0; for ($i = 1; $i < $N; $i++) { // first give previous value to dp[i] i.e.  // no pairing with (i-1)th element  $dp[$i] = $dp[$i-1]; // if current and previous element can form a pair  if ($arr[$i] - $arr[$i-1] < $K) { // update dp[i] by choosing maximum between  // pairing and not pairing  if ($i >= 2) $dp[$i] = max($dp[$i] $dp[$i-2] + $arr[$i] + $arr[$i-1]); else $dp[$i] = max($dp[$i] $arr[$i] + $arr[$i-1]); } } // last index will have the result  return $dp[$N - 1]; } // Driver code  $arr = array(3 5 10 15 17 12 9); $N = sizeof($arr) ; $K = 4; echo maxSumPairWithDifferenceLessThanK($arr $N $K); // This code is contributed by Ryuga ?> 
JavaScript
<script> // Javascript program to find maximum pair sum whose // difference is less than K  // method to return maximum sum we can get by  // finding less than K difference pair  function maxSumPairWithDifferenceLessThanK(arr  N K)  {    // Sort input array in ascending order.  arr.sort();    // dp[i] denotes the maximum disjoint pair sum  // we can achieve using first i elements  let dp = [];    // if no element then dp value will be 0  dp[0] = 0;    for (let i = 1; i < N; i++)  {  // first give previous value to dp[i] i.e.  // no pairing with (i-1)th element  dp[i] = dp[i-1];    // if current and previous element can form a pair  if (arr[i] - arr[i-1] < K)  {    // update dp[i] by choosing maximum between  // pairing and not pairing  if (i >= 2)  dp[i] = Math.max(dp[i] dp[i-2] + arr[i] +  arr[i-1]);  else  dp[i] = Math.max(dp[i] arr[i] + arr[i-1]);  }  }    // last index will have the result  return dp[N - 1];  } // Driver code to test above methods  let arr = [3 5 10 15 17 12 9];  let N = arr.length;  let K = 4;    document.write( maxSumPairWithDifferenceLessThanK(  arr N K)); // This code is contributed by avijitmondal1998. </script> 

Produktion
62

Tidskomplexitet: O(N Log N) 
Hjälputrymme: O(N)

hur man kommer åt icloud-bilder

En optimerad lösning med bidrag från Amit Sane ges nedan 

Genomförande:

C++
// C++ program to find maximum pair sum whose // difference is less than K #include    using namespace std; // Method to return maximum sum we can get by // finding less than K difference pairs int maxSumPair(int arr[] int N int k) {  int maxSum = 0;  // Sort elements to ensure every i and i-1 is closest  // possible pair  sort(arr arr + N);  // To get maximum possible sum   // iterate from largest to  // smallest giving larger   // numbers priority over smaller  // numbers.  for (int i = N - 1; i > 0; --i)   {  // Case I: Diff of arr[i] and arr[i-1]  // is less than Kadd to maxSum   // Case II: Diff between arr[i] and arr[i-1] is not  // less than K move to next i since with  // sorting we know arr[i]-arr[i-1] <  // rr[i]-arr[i-2] and so on.  if (arr[i] - arr[i - 1] < k)  {  // Assuming only positive numbers.  maxSum += arr[i];  maxSum += arr[i - 1];  // When a match is found skip this pair  --i;  }  }  return maxSum; } // Driver code int main() {  int arr[] = { 3 5 10 15 17 12 9 };  int N = sizeof(arr) / sizeof(int);  int K = 4;  cout << maxSumPair(arr N K);  return 0; } 
Java
// Java program to find maximum pair sum whose // difference is less than K import java.io.*; import java.util.*; class GFG {  // Method to return maximum sum we can get by  // finding less than K difference pairs  static int maxSumPairWithDifferenceLessThanK(int arr[]  int N  int k)  {  int maxSum = 0;  // Sort elements to ensure every i and i-1 is  // closest possible pair  Arrays.sort(arr);  // To get maximum possible sum   // iterate from largest  // to smallest giving larger   // numbers priority over  // smaller numbers.  for (int i = N - 1; i > 0; --i)  {  // Case I: Diff of arr[i] and arr[i-1] is less  // than K add to maxSum  // Case II: Diff between arr[i] and arr[i-1] is  // not less than K move to next i   // since with sorting we know arr[i]-arr[i-1] <  // arr[i]-arr[i-2] and so on.  if (arr[i] - arr[i - 1] < k)  {  // Assuming only positive numbers.  maxSum += arr[i];  maxSum += arr[i - 1];  // When a match is found skip this pair  --i;  }  }  return maxSum;  }  // Driver code  public static void main(String[] args)  {  int arr[] = { 3 5 10 15 17 12 9 };  int N = arr.length;  int K = 4;  System.out.println(  maxSumPairWithDifferenceLessThanK(arr N K));  } } // This code is contributed by vt_m. 
Python3
# Python3 program to find maximum pair sum # whose difference is less than K # Method to return maximum sum we can # get by finding less than K difference # pairs def maxSumPairWithDifferenceLessThanK(arr N k): maxSum = 0 # Sort elements to ensure every i and # i-1 is closest possible pair arr.sort() # To get maximum possible sum iterate # from largest to smallest giving larger # numbers priority over smaller numbers. i = N - 1 while (i > 0): # Case I: Diff of arr[i] and arr[i-1] # is less than K add to maxSum # Case II: Diff between arr[i] and # arr[i-1] is not less than K # move to next i since with sorting # we know arr[i]-arr[i-1] < arr[i]-arr[i-2] # and so on. if (arr[i] - arr[i - 1] < k): # Assuming only positive numbers. maxSum += arr[i] maxSum += arr[i - 1] # When a match is found skip this pair i -= 1 i -= 1 return maxSum # Driver Code arr = [3 5 10 15 17 12 9] N = len(arr) K = 4 print(maxSumPairWithDifferenceLessThanK(arr N K)) # This code is contributed by mits 
C#
// C# program to find maximum pair sum whose // difference is less than K using System; class GFG {    // Method to return maximum sum we can get by  // finding less than K difference pairs  static int maxSumPairWithDifferenceLessThanK(int []arr   int N int k)  {  int maxSum = 0;    // Sort elements to ensure  // every i and i-1 is closest  // possible pair  Array.Sort(arr);    // To get maximum possible sum   // iterate from largest  // to smallest giving larger  // numbers priority over   // smaller numbers.  for (int i = N-1; i > 0; --i)  {    /* Case I: Diff of arr[i] and   arr[i-1] is less than K  add to maxSum   Case II: Diff between arr[i] and   arr[i-1] is not less  than K move to next i   since with sorting we  know arr[i]-arr[i-1] <   arr[i]-arr[i-2] and  so on.*/  if (arr[i] - arr[i-1] < k)  {    // Assuming only positive numbers.  maxSum += arr[i];  maxSum += arr[i - 1];    // When a match is found   // skip this pair  --i;  }  }    return maxSum;  }  // Driver Code  public static void Main ()   {  int []arr = {3 5 10 15 17 12 9};  int N = arr.Length;  int K = 4;    Console.Write( maxSumPairWithDifferenceLessThanK(arr   N K));  } } // This code is contributed by nitin mittal. 
PHP
 // PHP program to find maximum pair sum  // whose difference is less than K  // Method to return maximum sum we can  // get by finding less than K difference // pairs  function maxSumPairWithDifferenceLessThanK($arr $N $k) { $maxSum = 0; // Sort elements to ensure every i and  // i-1 is closest possible pair  sort($arr); // To get maximum possible sum iterate  // from largest to smallest giving larger // numbers priority over smaller numbers.  for ($i = $N - 1; $i > 0; --$i) { // Case I: Diff of arr[i] and arr[i-1]  // is less than K add to maxSum  // Case II: Diff between arr[i] and  // arr[i-1] is not less than K  // move to next i since with sorting  // we know arr[i]-arr[i-1] < arr[i]-arr[i-2]  // and so on.  if ($arr[$i] - $arr[$i - 1] < $k) { // Assuming only positive numbers.  $maxSum += $arr[$i]; $maxSum += $arr[$i - 1]; // When a match is found skip this pair  --$i; } } return $maxSum; } // Driver Code $arr = array(3 5 10 15 17 12 9); $N = sizeof($arr); $K = 4; echo maxSumPairWithDifferenceLessThanK($arr $N $K); // This code is contributed  // by Sach_Code  ?> 
JavaScript
<script> // Javascript program to find // maximum pair sum whose // difference is less than K // Method to return maximum sum we can get by // finding less than K difference pairs function maxSumPairWithDifferenceLessThanK(arr N k) {  var maxSum = 0;  // Sort elements to ensure every i and i-1 is  // closest possible pair  arr.sort((ab)=>a-b);  // To get maximum possible sum   // iterate from largest  // to smallest giving larger   // numbers priority over  // smaller numbers.  for (i = N - 1; i > 0; --i)  {  // Case I: Diff of arr[i] and arr[i-1] is less  // than K add to maxSum  // Case II: Diff between arr[i] and arr[i-1] is  // not less than K move to next i   // since with sorting we know arr[i]-arr[i-1] <  // arr[i]-arr[i-2] and so on.  if (arr[i] - arr[i - 1] < k)  {  // Assuming only positive numbers.  maxSum += arr[i];  maxSum += arr[i - 1];  // When a match is found skip this pair  --i;  }  }  return maxSum; } // Driver code var arr = [ 3 5 10 15 17 12 9 ]; var N = arr.length; var K = 4; document.write(maxSumPairWithDifferenceLessThanK(arr N K)); // This code is contributed by 29AjayKumar  </script> 

Produktion
62

Tidskomplexitet: O(N Log N) 
Hjälputrymme: O(1)