LeetCode713 乘积小于 K 的子数组-----双指针

题目表述

给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。

示例:

输入: 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 的子数组。

双指针

  • 初始化left、right两个指针,计算[left, right]区间内的数字组成的乘积。

  • right 指针每划过一个数,就将该数字与前面的乘积进行累乘。

  • 如果当前乘积 >= k,就开始移动 left 指针并减少累乘的结果,也就是除nums[left]。

  • 计算以 right 为右边界所形成的有效子数组的个数(right - left + 1)

时间复杂度:O(N),滑动窗口的时间复杂度分析是这样的:right 指针是一直往右走(不回退),所以 right 最多遍历每个元素一次;而 left 指针是有条件的往右走,最多遍历每个元素一次。所以整体上,nums 中的每个元素最多进出窗口一次,所以时间复杂度最多是 O(2*N),去掉常数项可得 O(N)

class Solution { public int numSubarrayProductLessThanK(int[] nums, int k) { int left = 0; int right = 0; int sum = 1; int res = 0; while(right < nums.length && left <= right){ sum *= nums[right]; while(left <= right && sum >= k){ sum /= nums[left++]; } res += right - left + 1; right++; } return res; } }

__EOF__

本文作者Younger
本文链接https://www.cnblogs.com/youngerwb/p/16244483.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   YoungerWb  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示