Two Sum Less Than K

easy array two pointers sorting

Problem

Given an integer array nums and integer k, return the maximum sum s = nums[i] + nums[j] such that 0 ≤ i < j < n and s < k. If no such pair exists, return -1.

Inputnums = [34, 23, 1, 24, 75, 33, 54, 8], k = 60
Output58
34 + 24 = 58 < 60, the best pair sum under 60.

def two_sum_less_than_k(nums, k):
    nums = sorted(nums)
    l, r = 0, len(nums) - 1
    best = -1
    while l < r:
        s = nums[l] + nums[r]
        if s < k:
            best = max(best, s)
            l += 1
        else:
            r -= 1
    return best
function twoSumLessThanK(nums, k) {
  nums = nums.slice().sort((a, b) => a - b);
  let l = 0, r = nums.length - 1, best = -1;
  while (l < r) {
    const s = nums[l] + nums[r];
    if (s < k) { best = Math.max(best, s); l++; }
    else r--;
  }
  return best;
}
class Solution {
    public int twoSumLessThanK(int[] nums, int k) {
        Arrays.sort(nums);
        int l = 0, r = nums.length - 1, best = -1;
        while (l < r) {
            int s = nums[l] + nums[r];
            if (s < k) { best = Math.max(best, s); l++; }
            else r--;
        }
        return best;
    }
}
int twoSumLessThanK(vector<int>& nums, int k) {
    sort(nums.begin(), nums.end());
    int l = 0, r = (int)nums.size() - 1, best = -1;
    while (l < r) {
        int s = nums[l] + nums[r];
        if (s < k) { best = max(best, s); l++; }
        else r--;
    }
    return best;
}
Time: O(n log n) Space: O(1)