滑動窗口系列-Leetcode 713. 乘積小於 K 的子數組

問題描述

給定一個正整數數組 nums。

找出該數組內乘積小於 k 的連續的子數組的個數。

示例 1:

輸入: nums = [10,5,2,6], k = 100
輸出: 8
解釋: 8個乘積小於100的子數組分別爲: [10], [5],
[2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2]
並不是乘積小於100的子數組。

說明:

  • 0 < nums.length <= 50000
  • 0 < nums[i] < 1000
  • 0 <= k < 10^6

解題報告

一個數組的的子數組個數 爲以所有元素開頭的子數組個數或者以所有元素結尾的所有子數組個數。

  • 移動右指針,更新窗口內的乘積;
  • 如果窗口內的乘積大於等於 k,更新左指針,直到窗口內的乘積小於 k;
  • 移動右指針,更新窗口內的乘積;
  • 只要窗口內的乘積小於 k, 累加 r-l+1

實現代碼

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        if (k <= 1) return 0;
        int ans=0,l=0,r=0,tmpDoc=1;
        while(r<nums.size()){
            tmpDoc*=nums[r];
            while(tmpDoc>=k){
                tmpDoc/=nums[l];
                l++;
            }
            ans+=(r-l+1);
            r++;
        }
        return ans;
    }
};

參考資料

[1] Leetcode 713. 乘積小於 K 的子數組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章