算法-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;

    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务