日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)

發布時間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 很大時,用快速冪求取,過程中取模,避免溢出
class Solution { //C++int mod = 1e9+7; public:int numSubseq(vector<int>& nums, int target) {sort(nums.begin(),nums.end());int i = 0, j;unsigned long long count = 0;for(i = 0; i < nums.size(); ++i){if(nums[i] > target/2+1)break;j = bs(nums,target-nums[i]);if(j != -1 && j >= i)count = (count+mypow(j-i))%mod;}return count;}int bs(vector<int>& a, int t){int i = 0, j = a.size()-1, mid;while(i <=j){mid = (i+j)/2;if(a[mid] > t)j = mid-1;else{if(mid==a.size()-1 || a[mid+1] > t)return mid;elsei = mid+1;}}return -1;}int mypow(int n){long long s = 1, p = 2;while(n){if(n&1)s *= p, s %= mod;p *= p;p %= mod;n /= 2;}return s;} };

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 count

1528 ms 23.7 MB

總結

以上是生活随笔為你收集整理的LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。