Given an array A of integers and integer K, return the maximum S such that there exists i < j with A[i] + A[j] = S and S < K. If no i, j exist satisfying this equation, return -1.
Example:
1 2 3 4 5 6 7 8 9
Input: A = [34,23,1,24,75,33,54,8], K = 60 Output: 58 Explanation: We can use 34 and 24 to sum 58 which is less than 60.
Input: A = [10,20,30], K = 15 Output: -1 Explanation: In thiscase it's not possible to get a pair sum less that 15.
Note:
1 <= A.length <= 100
1 <= A[i] <= 1000
1 <= K <= 2000
Analysis
Brute-Force
1 2 3 4 5 6 7 8 9 10 11 12 13 14
publicinttwoSumLessThanK(int[] A, int K) { // Assume A[i] >= 1, K >= 1 intn= A.length; intmaxSum= -1; for (inti=0; i < n; ++i) { for (intj= i + 1; j < n; ++j) { intsum= A[i] + A[j]; if (sum < K && sum > maxSum) { maxSum = sum; } } } return maxSum; }
Time: $O(N^2)$ Space: $O(1)$
Sorting & Two Pointers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
publicinttwoSumLessThanK(int[] A, int K) { // Assume A[i] >= 1, K >= 1 // Sorting Arrays.sort(A); // Two Pointers intmaxSum= -1; intn= A.length; intlo=0, hi = n - 1; while (lo < hi) { intsum= A[lo] + A[hi]; if (sum >= K) { --hi; } else { // sum < K if (sum > maxSum) maxSum = sum; // update ++lo; } } return maxSum; }