LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
給你一個整數數組 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)示例 2: 輸入:nums = [3,3,6,8], target = 10 輸出:6 解釋:有 6 個子序列滿足該條件。(nums 中可以有重復數字) [3] , [3] , [3,3], [3,6] , [3,6] , [3,3,6]示例 3: 輸入:nums = [2,3,3,4,6,7], target = 12 輸出:61 解釋:共有 63 個非空子序列,其中 2 個不滿足條件([6,7], [7]) 有效序列總數為(63 - 2 = 61)示例 4: 輸入:nums = [5,2,4,1,7,6,8], target = 16 輸出:127 解釋:所有非空子序列都滿足條件 (2^7 - 1) = 127提示: 1 <= nums.length <= 10^5 1 <= nums[i] <= 10^6 1 <= target <= 10^6來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-subsequences-that-satisfy-the-given-sum-condition
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 排序
- 遍歷左端點 i ,二分查找小于等于 target-nums[i]的最后一個數 j
- 包含左端點 i 的滿足條件的子序列個數為:2j?i2^{j-i}2j?i 個
- 然后 j?ij-ij?i 很大時,用快速冪求取,過程中取模,避免溢出
452 ms 48 MB
python3 解答
class Solution:# py3def numSubseq(self, nums: List[int], target: int) -> int:mod = int(1e9+7)nums.sort()def bs(t):i,j = 0, len(nums)-1while i <= j:mid = (i+j)>>1if nums[mid] > t:j = mid-1else:if mid==len(nums)-1 or nums[mid+1] > t:return midelse:i = mid+1return -1def mypow(n):s, p = 1, 2while n:if n&1:s *= ps %= modp *= pp %= modn //= 2return scount = 0for i in range(len(nums)):if nums[i] > target//2+1:break;j = bs(target-nums[i])if j != -1 and j >= i:count = (count + mypow(j-i))%modreturn count1528 ms 23.7 MB
總結
以上是生活随笔為你收集整理的LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 692. 前K个高频单
- 下一篇: LeetCode 1419. 数青蛙(脑