#practiceLinkDiv { 표시: 없음 !중요; }정수 배열과 숫자 k가 주어졌습니다. 두 숫자의 차이가 k보다 작으면 배열의 두 숫자를 쌍으로 연결할 수 있습니다. 이 작업은 서로소 쌍의 가능한 최대 합을 찾는 것입니다. P 쌍의 합은 모든 2P 쌍 수의 합입니다.
자바 if else 문
예:
권장 실습 구체적인 차이가 있는 쌍 시도해 보세요!입력 : arr[] = {3 5 10 15 17 12 9} K = 4
출력 : 62
설명:
그러면 차이가 K보다 작은 서로소 쌍은 (3 5) (10 12) (15 17)입니다.
따라서 우리가 얻을 수 있는 최대 합은 3 + 5 + 12 + 10 + 15 + 17 = 62입니다.
분리된 쌍을 형성하는 다른 방법은 (3 5) (9 12) (15 17)이지만 이 쌍은 더 적은 합을 생성합니다.
입력 : arr[] = {5 15 10 300} k = 12
출력 : 25
접근하다: 먼저 주어진 배열을 오름차순으로 정렬합니다. 배열이 정렬되면 배열을 탐색합니다. 모든 요소에 대해 먼저 이전 요소와 쌍을 이루려고 합니다. 이전 요소를 선호하는 이유는 무엇입니까? arr[i]는 arr[i-1] 및 arr[i-2]와 쌍을 이룰 수 있습니다(예: 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.
755 chmod
이제 위의 사실을 관찰하여 아래와 같이 동적 프로그래밍 솔루션을 공식화할 수 있습니다.
dp[i]는 배열의 첫 번째 i 요소를 사용하여 달성할 수 있는 최대 분리 쌍 합계를 나타냅니다. 현재 우리가 i번째 위치에 있다고 가정하면 두 가지 가능성이 있습니다.
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]
위의 반복에는 O(N) 시간이 걸리고 배열 정렬에는 O(N log N) 시간이 걸리므로 솔루션의 총 시간 복잡도는 O(N log N)이 됩니다.
구현:
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>
산출
62
시간 복잡도: O(N Log N)
보조 공간: O(N)
자바 선택 정렬
Amit Sane이 제공한 최적화된 솔루션은 다음과 같습니다.
구현:
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>
산출
62
시간 복잡도: O(N Log N)
보조 공간: O(1)