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)
__EOF__

本文作者:Younger
本文链接:https://www.cnblogs.com/youngerwb/p/16244483.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/youngerwb/p/16244483.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
分类:
刷题笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理