Number of Subsequences That Satisfy the Given Sum Condition

medium array two pointers binary search sorting

Problem

Given nums and target, count non-empty subsequences where min + max ≤ target. Return modulo 10^9+7.

Inputnums=[3,5,6,7], target=9
Output4
[3], [3,5], [3,5,6], [3,6] — 4 valid subsequences.

def num_subseq(nums, target):
    MOD = 10**9 + 7
    a = sorted(nums)
    n = len(a)
    pow2 = [1] * n
    for i in range(1, n): pow2[i] = pow2[i-1] * 2 % MOD
    l, r, ans = 0, n - 1, 0
    while l <= r:
        if a[l] + a[r] <= target:
            ans = (ans + pow2[r - l]) % MOD; l += 1
        else:
            r -= 1
    return ans
function numSubseq(nums, target) {
  const MOD = 1_000_000_007n;
  const a = nums.slice().sort((x, y) => x - y);
  const n = a.length, pow2 = new Array(n).fill(1n);
  for (let i = 1; i < n; i++) pow2[i] = pow2[i-1] * 2n % MOD;
  let l = 0, r = n - 1, ans = 0n;
  while (l <= r) {
    if (a[l] + a[r] <= target) { ans = (ans + pow2[r - l]) % MOD; l++; }
    else r--;
  }
  return Number(ans);
}
class Solution {
    public int numSubseq(int[] nums, int target) {
        long MOD = 1_000_000_007L;
        Arrays.sort(nums);
        int n = nums.length;
        long[] p = new long[n]; p[0] = 1;
        for (int i = 1; i < n; i++) p[i] = p[i-1] * 2 % MOD;
        int l = 0, r = n - 1; long ans = 0;
        while (l <= r) {
            if (nums[l] + nums[r] <= target) { ans = (ans + p[r - l]) % MOD; l++; }
            else r--;
        }
        return (int) ans;
    }
}
int numSubseq(vector& nums, int target) {
    long long MOD = 1000000007LL;
    sort(nums.begin(), nums.end());
    int n = nums.size();
    vector p(n, 1);
    for (int i = 1; i < n; i++) p[i] = p[i-1] * 2 % MOD;
    int l = 0, r = n - 1; long long ans = 0;
    while (l <= r) {
        if (nums[l] + nums[r] <= target) { ans = (ans + p[r - l]) % MOD; l++; }
        else r--;
    }
    return (int) ans;
}
Time: O(n log n) Space: O(n)