等价于求最大元素和最小元素小于target的非空子集问题。
- 排序
- 双指针维护满足题意的最大窗口[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;
}
}