给你一个整数数组 nums 和一个整数 target 。
请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。
由于答案可能很大,请将结果对 10^9 + 7 取余后返回。
先对数组进行排序 枚举可能子序列的最小值
用二分法找到满足条件的最大值
2的(最大值-最小值)次幂为当前最小值可能的子序列数目
预处理数组 求出2的对应次幂取余
class Solution {
static final int P = 1000000007;
int MAX_N;
int[] f;
public int numSubseq(int[] nums, int target) {
MAX_N = nums.length;
f = new int[MAX_N];
pretreatment();
Arrays.sort(nums);
int ans = 0;
for (int i = 0; i < nums.length && nums[i] * 2 <= target; ++i) {
int maxValue = target - nums[i];
int pos = binarySearch(nums, maxValue);
int contribute = (pos >= i) ? f[pos - i] : 0;
ans = (ans + contribute) % P;
}
return ans;
}
public void pretreatment() {
f[0] = 1;
for (int i = 1; i < MAX_N; ++i) {
f[i] = (f[i - 1] << 1) % P;
}
}
private int binarySearch(int[] nums, int target){
int start = 0, end = nums.length - 1;
while(start + 1 < end){
int mid = start + ((end - start) >> 1);
if(nums[mid] <= target){
start = mid;
}else
end = mid;
}
if(nums[end] <= target)
return end;
return start;
}