[Leetcode713]乘积小于 K 的子数组

公司里偷偷刷题记录

做一下笔记

求解子数组方式:
两种方案:
通用方案就是前缀和查找
另一种是递增序列可用的滑动窗口

有些题目如果给出来的数字有正,负。那么一定就要转化成前缀和。
如果是全正数组,可以采用前缀和+二分查找的方式。但是这个效率似乎没有滑动窗口高,不知道是不是leetcode数据量的问题,没有专门压测评估过。

习题解答

leetcode713

  • 题目:https://leetcode.cn/problems/subarray-product-less-than-k/

  • 乘积小于 K 的子数组

  • C++ 方案采用前缀和的形式

#include <iostream>using namespace std;
class Solution {
public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {if (k == 0) {return 0;}int n = nums.size();vector<double> logPrefix(n + 1);for (int i = 0; i < n; i++) {logPrefix[i + 1] = logPrefix[i] + log(nums[i]);//cout << logPrefix[i] << endl;}// cout << logPrefix.end() - logPrefix.begin() << endl;//cout << logPrefix.end() << endl;double logk = log(k);int res = 0;//for (int j = 0; j < n; j++) {//    int mid = upper_bound(logPrefix.begin(), logPrefix.begin() + j + 1, logPrefix[j + 1] - log(k) + 1e-10) - logPrefix.begin();//    res += j - mid + 1;//}for (int j = 0; j < n; j++) {// 定义边界int left = 0;int right = j + 1;// 定义返回值,一般是右端,int mid_res = j + 1;// 定义特殊判断条件,若有double val = logPrefix[j + 1] - logk + 1e-10;// 二分循环            while (left < right) {// 获取中点int mid = (left + right) / 2;// 二分判断if (logPrefix[j+1] - logPrefix[mid] + 1e-10 < logk) {// 满足条件赋值mid_res = mid;right = mid; // 根据实际情况向左找} else {left = mid + 1; // 向右找。}}// 找到后统计,这个一行是本题的关键。res += j + 1 - mid_res;}return res;}
};
  • C语言采用滑动窗口
int numSubarrayProductLessThanK(int* nums, int numsSize, int k){// 乘机肯定不会小于1或者0if (k <= 1) {return 0;}int sum = 1;int left = 0;int count = 0;// 滑窗时候,右指针一般是快指针,用循环实现// 左指针一般是慢指针,通过条件判断移动for (int right = 0; right < numsSize; right++) {sum *= nums[right];while (sum >= k) {sum /= nums[left++];}// 因为都是正数所以我们可以用滑动窗口,也就是快慢指针去操作// 每经过一个快指针,我们可以这么统计// 既然从left累乘到right都满足元素严格小于k// 那么从left到right中的任意一个下标移动到right都可以满满足小于k// 那么不重复的统计子数组的数量就是从right - left + 1count += right - left + 1;}return count;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leetcode15]三数之和

重刷一遍相向双指针 题目 leetcode15 https://leetcode.cn/problems/3sum/ 类似的题目还有leetcode16 leetcode16 解答思路 关键点 快排 双指针 1&#xff1a; 快速排序&#xff0c;之后使用双指针遍历对应的位置&#xff0c;求解 2&#xff1a; 主要是在确定了第一个值…

光学元件生产工艺流程

光学元件生产工艺流程 选胚料 – 开料(初步切割)- 清洗 - 上盘(批处理) – 切割 – 粗磨整平 – 粗检 – 细磨上盘 – 细磨 – 高速抛光 – 低速抛光 – 光胶 – 成片 – 上盘 – 成品切割 – 清洗 – 包装 粗磨阶段 选胚料: 选择光学元件的原材料,如K9,BK7玻璃等 开…

[leetcode933]最近的请求次数

每日偷偷刷题933和队列有关 思路 每来一次ping就记录时间&#xff0c;并返回3000s内ping的次数&#xff0c;本题数据量很大&#xff0c;正向暴力肯定是不行的。 初步思路&#xff1a;反向暴力&#xff0c;不删列表数据。从ping的下标往前推&#xff0c;并统计3000s的数据。 …

[leetcode]5. 最长回文子串 647. 回文子串

昨日刷题&#xff0c;今日补发 解题思路 中间扩展&#xff0c;遍历数组&#xff0c;以每一项为中心&#xff0c;或以每两项为中心&#xff0c;向外拓展。 学习一下pair概念&#xff0c;还有string的substr的用法 以下是leetcode第五题 C做法 class Solution { public:pair…

牛客网选择题刷题记录之C++

数据结构 顺序表 在一个长度为n的顺序表的任意位置插入一个新元素的渐进时间复杂度为&#xff08;&#xff09; A. O&#xff08;n&#xff09; B. O&#xff08;n/2&#xff09; C. O&#xff08;1&#xff09; D. O&#xff08;n的平方&#xff09; 答案&#xff1a; A 解析…

[剑指offer 24] 反转链表

题目复习反转链表 字节面试的一道面试考题。属于简单题&#xff0c;毕竟复杂的面试也不好判题对吧&#xff08;狗头&#xff09; 思路 思路不难&#xff0c;首先我们观察链表&#xff0c;一般链表指的都是单向链表 struct ListNode {int val;struct ListNode *next; };那么…

[剑指offer 27][LeetCode234] 回文链表

偷偷刷题记录 回文链表 思路 思路1. 处理链表最粗暴的方式就是拷贝到数组中。考试时候也是&#xff0c;只要不会超内存&#xff0c;完全这么办 思路2. 快慢指针。因为我们判断是不是回文链表&#xff0c;回文的特性就是以中为界&#xff0c;两头对称。由于我们不能像使用数组…

牛客网选择题刷题记录之Linux系统

linux运维 linux指令 下面有关linux查看系统负载的命令&#xff0c;说法错误的是&#xff1f; A. uptime命令主要用于获取主机运行时间和查询linux系统负载等信息 B. vmstat命令可以查看查看cpu负载 C. sar -n命令可以查看网络接口信息 D. free命令可以查看磁盘负载情况 答案&…

Keil_uvision_4基本使用教程

前言&#xff1a; keil uvision 5 和 4 使用方式差不多 Keil_uvision_4基本使用教程 Keil C51 V9.00 即09年发布的最新版本uVision 4&#xff0c;版本外观改变比较大 可以使用以前的注册文件如果全新安装&#xff0c;在VISTA或者WIN 7系统下…

MySQL语法看这一篇就够啦

MySQL语法看这一篇就够啦1. MySQL介绍与登录1.1 MySQL介绍1.2 Mariadb安装与启动1.2.1 在centos7环境下安装启动登录数据库操作部分增删改查&#xff1a;增 CREATE DATABASE增删改查&#xff1a;删 DROP增删改查&#xff1a;查找数据库 SHOW DATABASE使用数据库&#xff1a;use…

Python数据库:嵌入式MySQL

Python数据库&#xff1a;嵌入式MySQLPython访问MySQL的库函数PyMySQL安装PyMySQL快速上手以及代码上下文PyMySQL常见语法1. 导包2.连接数据库 connect3. 创建访问对象 cursor4. 下达命令 cursor.execute5. 接收结果 cursor.fetch*6.事务的用法7. 关闭mysql链接 closePython访问…

部门名称部门结构叠用_金属结构分公司三部门联合开展工会小组活动

为丰富职工的业余生活&#xff0c;营造轻松欢乐的氛围&#xff0c;增强部门间交流沟通&#xff0c;舒缓职工工作压力&#xff0c;在金属结构分公司工会的支持下&#xff0c;9月12日&#xff0c;分公司工程管理部、安全监管部和综合办公室联合开展工会小组活动&#xff0c;分公司…

linux环境下安装Java运行Java

Linux环境下安装与运行Java一. Linux环境下安装Java环境——最最最简单粗暴的教程二. Linux下编译Java代码---javac和java命令的使用2.1 编译单个java文件2.2 编译多个Java文件&#xff0c;每个类都在一个包中2.3 不同包编译一. Linux环境下安装Java环境——最最最简单粗暴的教…

不是区块链的特征_上市公司日照港物流区块链平台上线,不是谁都能玩“区块链+物流”?...

免责声明&#xff1a;本文旨在传递更多市场信息&#xff0c;不构成任何投资建议。文章仅代表作者观点&#xff0c;不代表火星财经官方立场。小编&#xff1a;记得关注哦投资区块链&#xff0c;猛戳&#xff1a;火星财经App下载来源&#xff1a;火星一线文 | 成文厚火星财经APP(…

lg手机历史机型_华为后,又一中国芯崛起!国际手机巨头LG都采用它的芯片了...

众所周知&#xff0c;这几年芯片火热&#xff0c;中国芯片厂商们也是受到了大家空前的关注。任何有关于中国芯的利好&#xff0c;都会被放大&#xff0c;被网友们看好。当然&#xff0c;华为是中国这些芯片企业中最强的&#xff0c;5G芯片华为也是目前最领先的&#xff0c;像巴…

Python学习笔记(6): 如何消除字符串前后中间的空白

Python如何消除字符串前后中间的空白 &#xff08;这里不使用正则表达式非常适合小白&#xff09; 相信这是很多人都会遇到的一个小问题。其实要是只想消除前后的空白。我们知道在C/C语言中只需要将字符串数组进行遍历&#xff0c;遇到非字母的值直接剔除即可。那么python要怎…

python转义引号的作用_python传到前端的数据,双引号被转义的问题

python部分def mallTemplateConfig(request):gameRole_edit request.session.get(gameRole_edit, []) #获取json串return render(request, "operationGL/mallTemplateConfig.html",{gameRole_edit: json.dumps(gameRole_edit)})html部分这样写显示正常&#xff0c;没…

Java学习资料汇总

Java语言特点和常见错误1 Java语言特点总结1.1 语言特点1.2 运行机制1.3 JVM虚拟机1.4 JRE运行环境1.5 JDK开发环境Linux下的java安装,编译,运行三大引用类型1 Java语言特点总结 这段内容来自北大唐教授的教案 1.1 语言特点 • 无直接指针操作 • 自动内存管理 • 数据类型长…

任意python版本下载,所有python版本下载的FTP路径

python的官网一般只会给出一些最常用的和最近最新发布的python版本&#xff0c;那么如何去下载任意的python版本呢。 python版本的存储是一个ftp路径&#xff0c;我们输入如下网站&#xff0c;就可以找到所有的python版本。 https://www.python.org/ftp/python

埃斯顿机器人 王杰高_埃斯顿自动化王杰高博士受邀赴韩参加“ROBOT WORLD 2016”等一系列相关活动...

10月12-13日&#xff0c;2016韩国机器人世界展览会(“ROBOT WORLD 2016”)在韩国KINTEX(一山)隆重举行。该展会由韩国机器人产业协会主办&#xff0c;是规模最为盛大的三大国际机器人展会之一。同期&#xff0c;由中国机器人产业联盟(CRIA)与韩国机器人产业协会(KAR)共同主办的…