1034-乘积小于 K 的子数组
题目如下
给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 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的子数组。
示例 2:
输入: nums = [1,2,3], k = 0
输出: 0
解题思路
1.要用滑窗这个思路来解题的方向比较好确定,这一步比较简单
2.滑窗内求乘积也好求,那么判断比较k和乘积的大小也好说
3.下一步滑窗内的子数组个数这个不难,但是问题在于滑动窗口移动后可能和之前的滑窗有重叠,这样我们需要解决怎么去除掉重复统计到的子数组数量的问题了,好像比较麻烦,其实也不是不行,还是有方法的(子数组左右边界求哈希,再用哈希表判断重复,不过此处不是重点,我们继续后面的思考)
4.这样我们需要知道不同子数组区间,他们的子数组有重叠的情况是因为滑窗左边或者右边移动引起的,而我们这一题中的滑窗左右边界是永远都往右移动的
5.那么,当左边界往右移动的时候产生的都是重复的连续子数组,只有右边界往右移动的时候才会产生新的连续子数组
6.所以
只有在右边界往右移动的时候才去统计以右边界为结束的子数组的数量
以右边界为结束的子数组的数量即为这个子数组的长度 right - left + 1
解题代码
class Solution
{public:int numSubarrayProductLessThanK(vector<int>nums, int k){int ans = 0;int left = 0;int right = 0;int n = nums[0];if (n < k){//初始一个是否需要的判断ans = 1;}while (true){if (n >= k){//如果当前乘积大于等于,则需要右移左边界,并除去相应的值n /= nums[left];left++;if (left > right){//如果左边界在右边界右边了,需要同时移动右边界right++;if (right == nums.size()){//如果右边界越界了,则终止break;}n *= nums[right];}}else{//如果当前乘积小于,则需要右移右边界,并乘上相应的值right++;if (right == nums.size()){//如果右边界越界了,则终止break;}n *= nums[right];}if (n < k){//经过本轮移动之后的乘积值判断,并统计数量ans += right - left + 1;}}return ans;}
};
1034-乘积小于 K 的子数组相关推荐
- LeetCode 937. 重新排列日志文件 / 1823. 找出游戏的获胜者(约瑟夫环问题) / 713. 乘积小于 K 的子数组
937. 重新排列日志文件 2022.5.3 每日一题 题目描述 给你一个日志数组 logs.每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 . 有两种不同类型的日志: 字母日志: ...
- LeetCode 713、乘积小于 K 的子数组
713.乘积小于 K 的子数组 1)题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目. 示例 1: 输入:nums = [10,5 ...
- 0505|713. 乘积小于 K 的子数组
0505|713. 乘积小于 K 的子数组 mid 滑动窗口. 求连续子树组的个数,"连续子树组"很强的暗示---使用滑动窗口. 本题只需记录 以每个数字为右边界所形成的有效子数组 ...
- LeetCode713. 乘积小于K的子数组
LeetCode713. 乘积小于K的子数组 1. 问题描述 2. 思路 经典双指针问题 3. 代码 func numSubarrayProductLessThanK(nums []int, k in ...
- Leetcode--713. 乘积小于k的子数组
给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小于100的子数 ...
- 20191021:(leetcode习题)乘积小于K的子数组
乘积小于K的子数组 题目 大致思路 代码实现 题目 给定一个正整数数组 nums.找出该数组内乘积小于 k 的连续的子数组的个数. 输入: nums = [10,5,2,6], k = 100 输出: ...
- 力扣 713. 乘积小于K的子数组
题目 给定一个正整数数组 nums和整数 k . 请找出该数组内乘积小于 k 的连续的子数组的个数. 示例 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小 ...
- LeetCode 713 乘积小于K的子数组
写在前面 一道很艺术的编程题~做学习记录 题目描述 给定一个正整数数组 nums和整数 k . 请找出该数组内乘积小于 k 的连续的子数组的个数. 示例 示例1: 输入: nums = [10,5,2 ...
- 解题思路-LeetCode第713题:乘积小于K的子数组
解题思路-LeetCode第713题:乘积小于K的子数组 题目描述: 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2 ...
- 713. 乘积小于 K 的子数组
给定一个正整数数组 nums和整数 k . 请找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小 ...
最新文章
- python中文解释-python注释不能识别中文
- 类属性的存储和this指针
- Java Script 学习笔记(一)
- 酷毙了!三种风格的全屏幻灯片效果【附源码下载】
- hdu_2089 不要62
- php 解压dat,电脑微信dat文件怎么打开
- c# npoi 2.5版本设置字体加粗_Python帮你做Excel——格式设置与画图
- 如何退出vim编辑器?
- ZOJ-3953 Intervals,t
- MySQL 千万级数据SQL的查询优化30条总结
- 配置Android应用开发环境
- 在Win10上安装VC6
- 【机械】如何用SOLIDWORKS进行ArtCam雕刻机排版
- Windows NT 内核基本结构
- 百度程序员猝死 是否过劳死引发争论
- 聚类——K均值简介及Python实现
- jQuery教程(整理自W3CSchool)(第一部分)
- daniel powter
- 博士生成长需要经历的7道门
- scons 自定义命令行参数传递