算法-leetcode-1498. 满足条件的子序列数目
题目:满足条件的子序列数目
1. 题目描述
给你一个整数数组 nums 和一个整数 target 。
请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。
由于答案可能很大,请将结果对 10^9 + 7 取余后返回。
2. 示例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)
3. 题解:预先存储+双指针
预先排序。创建辅助数组,预先统计子序列的数目且取余。采用双指针分别指向数组两端l,r,如果两端和大于target则直接跳过r--,否则累加子数列数目。代码如下:
class Solution {
public int numSubseq(int[] nums, int target) {
Arrays.sort(nums);
int[] temp = new int[nums.length];
int mode = 1000000007;
temp[0] = 1;
for(int i = 1; i < temp.length; ++i){
temp[i] = (temp[i - 1] << 1) % mode;
}
int res = 0;
int l = 0;
int r = nums.length - 1;
while(l <= r){
if(nums[l] + nums[r] > target){
--r;
}else{
res = (res + temp[r -l]) % mode;
++l;
}
}
return res;
}
}
科大讯飞公司氛围 472人发布