LeeCode 1498. 满足条件的子序列数目

等价于求最大元素和最小元素小于target的非空子集问题。

  1. 排序
  2. 双指针维护满足题意的最大窗口[i, j],方案数目:\(2^{j-i}\)
    注意: 分析重复情况。
class Solution {
    public int numSubseq(int[] nums, int target) {
        int n = nums.length, mod = 1000000007;
        int[] p = new int[n+1];
        p[0] = 1;
        
        for(int i=1; i <= n; i++) p[i] = p[i-1]*2 % mod;
        int res = 0;
        Arrays.sort(nums);
        for(int i=0, j= n-1; i <= j; i++) {
            while(i <= j && nums[i]+nums[j] > target) j--;
            if(i <= j && nums[i] + nums[j] <= target) 
                res = (res + p[j-i]) % mod;
        }
        return res;
    }
}
posted @ 2020-07-14 18:48  li修远  阅读(165)  评论(0编辑  收藏  举报