- 满足条件的子序列数目
给你一个整数数组 nums 和一个整数 target 。
请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。
由于答案可能很大,请将结果对 10^9 + 7 取余后返回。
示例 1:
输入:nums = [3,5,6,7], target = 9
输出:4
解释:有 4 个子序列满足该条件。
[3] -> 最小元素 + 最大元素 <= target (3 + 3 <= 9)
[3,5] -> (3 + 5 <= 9)
[3,5,6] -> (3 + 6 <= 9)
[3,6] -> (3 + 6 <= 9)
思路:先排序
两个指针,一个遍历 lo,一个hi 遍历的时候寻找到target-nums[lo]>nums[hi] 寻找到最大的hi. 然后这个lo到hi之间的就是子序列,一共有2^(hi-lo)这么多个序列,然后lo寻找下一个
public int numSubseq(int[] nums, int target){
Arrays.sort(nums);
int res=0;
int mod=(int)1e9+7;
int[] pow=new int[nums.length+1];
pow[0]=1;
for(int i=1;i<=nums.length;i++){
pow[i]=pow[i-1]*2%mod;
}
if(nums.length>2&&nums[nums.length-2]+nums[nums.length-1]<target&&nums[nums.length-1]<target)
{
return pow[nums.length]-1;
}
if(nums[0]>target) return 0;
int cnt=0;
int lo=0,hi=nums.length-1;
while(lo<=hi){
if(target>=nums[lo]+nums[hi]){
cnt+=pow[hi-lo];
cnt%=mod;
lo++;
}
else {
hi--;
}
}
return cnt;
}