首页 > 其他分享 >Leetcode 1498. 满足条件的子序列数目

Leetcode 1498. 满足条件的子序列数目

时间:2024-10-04 11:44:55浏览次数:7  
标签:满足条件 power2ModArr nums int length 1498 modVal Leetcode MOD

1.题目基本信息

1.1.题目描述

给你一个整数数组 nums 和一个整数 target 。

请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。

由于答案可能很大,请将结果对 109 + 7 取余后返回。

1.2.题目地址

https://leetcode.cn/problems/number-of-subsequences-that-satisfy-the-given-sum-condition/description/

2.解题方法

2.1.解题思路

遍历第一个元素,以第一个元素为锚,二分查找第二个边界条件

2.2.解题步骤

第一步,将数组进行升序排列

第二步,预处理2的n次方的取模值,应用的原理是(ab)%MOD=[(a%MOD)(b%MOD)]%MOD

第三步,遍历第一个值i,通过二分法找到最后一个j使得nums[i]+nums[j]<=target,累加2**(j-i)即为题解(注意取模)

3.解题代码

Python代码

class Solution:
    # 遍历第一个元素,以第一个元素为锚,二分查找第二个边界条件
    def numSubseq(self, nums: List[int], target: int) -> int:
        length=len(nums)
        # 第一步,将数组进行升序排列
        nums.sort()
        # 第二步,预处理2的n次方的取模值,应用的原理是(a*b)%MOD=[(a%MOD)*(b%MOD)]%MOD
        modVal=10**9 + 7
        power2ModArr=[0]*length
        power2ModArr[0]=1
        for i in range(1,len(power2ModArr)):
            power2ModArr[i]=power2ModArr[i-1]*2%modVal
        # print(power2ModArr)
        # 第三步,遍历第一个值i,通过二分法找到最后一个j使得nums[i]+nums[j]<=target,累加2**(j-i)即为题解(注意取模)
        result=0
        for i in range(length):
            if nums[i]*2>target:
                break
            # 二分找到最后一个j使得nums[i]+nums[j]<=target
            # 红:nums[i]+nums[j]<=target处,蓝:大于target;左闭右闭:left-1始终指向红色,right+1始终指向蓝色。最终的right即为需要找到的j
            left,right=i,length-1
            while left<=right:
                mid=(right-left)//2+left
                if nums[i]+nums[mid]<=target:
                    left=mid+1
                else:
                    right=mid-1
            if right>=i:
                result+=power2ModArr[right-i]
        return result%modVal

C++代码

class Solution {
public:
    int numSubseq(vector<int>& nums, int target) {
        int length=nums.size();
        sort(nums.begin(),nums.end());
        int modVal=1E9+7;
        vector<int> power2ModArr(length,0);
        power2ModArr[0]=1;
        for(int i=1;i<length;++i){
            power2ModArr[i]=power2ModArr[i-1]*2%modVal;
        }
        long long result=0;
        for(int i=0;i<length;++i){
            if(nums[i]*2>target){
                break;
            }
            int left=1,right=length-1;
            while(left<=right){
                int mid=(right-left)/2+left;
                if(nums[i]+nums[mid]<=target){
                    left=mid+1;
                }else{
                    right=mid-1;
                }
            }
            if(right>=i){
                result+=power2ModArr[right-i];
            }
        }
        return result%modVal;
    }
};

4.执行结果

在这里插入图片描述

标签:满足条件,power2ModArr,nums,int,length,1498,modVal,Leetcode,MOD
From: https://www.cnblogs.com/geek0070/p/18446459

相关文章

  • [leetcode 92] 反转链表 II
    题目描述:https://leetcode.cn/problems/reverse-linked-list-ii给你单链表的头指针 head 和两个整数 left 和 right ,其中 left<=right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例1:输入:head=[1,2,3,4,5],left=2,right......
  • <动态规划>Leetcode96.不同的二叉搜索树
    给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。解题步骤如下:二叉搜素树的相关概念寻找规律思路建立代码实现1.二叉搜索树的相关概念①:若左子树不空,则左子树所有节点的值均小于它的根节点的值。......
  • Leetcode 540. 有序数组中的单一元素
    1.题目基本信息1.1.题目描述给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足O(logn)时间复杂度和O(1)空间复杂度。1.2.题目地址https://leetcode.cn/problems/single-ele......
  • Leetcode 275. H 指数 II
    1.题目基本信息1.1.题目描述给你一个整数数组citations,其中citations[i]表示研究者的第i篇论文被引用的次数,citations已经按照升序排列。计算并返回该研究者的h指数。h指数的定义:h代表“高引用次数”(highcitations),一名科研人员的h指数是指他(她)的(n篇论文中)至......
  • [LeetCode] 1497. Check If Array Pairs Are Divisible by k
    Givenanarrayofintegersarrofevenlengthnandanintegerk.Wewanttodividethearrayintoexactlyn/2pairssuchthatthesumofeachpairisdivisiblebyk.ReturntrueIfyoucanfindawaytodothatorfalseotherwise.Example1:Input:arr......
  • leetcode24 两两交换链表中的节点(swap-nodes-in-pairs)
    题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] 提示:链表中节点的数......
  • Leetcode 1193 每月交易(探究当有关联字段有NULL值如何做左右关联
    题目现有一个交易表Transactions,内有id,country,state(列类型为["approved","declined"]),amount金额,trans_date交易日期。编写一个sql查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。以 任意顺序 返回结果表。数据准备CreatetableIfN......
  • Leetcode 1907 按分类统计薪水
    一、题目查询每个工资类别的银行账户数量。 工资类别如下:"LowSalary":所有工资 严格低于 20000 美元。"AverageSalary": 包含 范围内的所有工资 [$20000, $50000] 。"HighSalary":所有工资 严格大于 50000 美元。结果表 必须 包含所有三个类别。 如果某个类......
  • leetcode刷题day34|动态规划Part03 背包问题(01背包问题 二维、01背包问题 一维、416.
    0-1背包问题二维动规五部曲1、确定dp数组以及下标的含义dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。(取物品时可以是取0-i的任意一个,或者是他们的组合)2、确定递推公式不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i-1][j]......
  • leetcode刷题day33|动态规划Part02(62.不同路径、63. 不同路径 II、 343.整数拆分、96.
    62.不同路径机器人从(0,0)位置出发,到(m-1,n-1)终点。动规五部曲1、确定dp数组(dptable)以及下标的含义dp[i][j]:表示从(0,0)出发,到(i,j)有dp[i][j]条不同的路径。2、确定递推公式想要求dp[i][j],只能有两个方向来推导出来,即dp[i-1][j]和dp[i][j-1]。dp[i]......