最大公因数等于 K 的子数组数目

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 nums 的子数组中元素的最大公因数等于 k 的子数组数目。

子数组 是数组中一个连续的非空序列。

数组的最大公因数 是能整除数组中所有元素的最大整数。

示例 1:

输入:nums = [9,3,1,2,6,3], k = 3
输出:4
解释:nums 的子数组中,以 3 作为最大公因数的子数组如下:
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]
- [9,3,1,2,6,3]

示例 2:

输入:nums = [4], k = 7
输出:0
解释:不存在以 7 作为最大公因数的子数组。

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i], k <= 10^9

思路分析

首先我们要先理解一下题目的意思,题目会给我们一个整数数组 nums 和一个整数 k,我们需要统计并返回 nums 的子数组中元素的最大公因数等于 k 的子数组数目。

一个序列中最大公因数等于k需要满足以下条件:

  • 1、所有元素均为k的倍数;
  • 2、至少一个元素与其他所有元素的最大公因数都是k

知道了这两个条件之后我们便可以开始编写代码了:

  • 1、记录每个位置前后连续元素为k的倍数的个数;

因为一个序列中最大公因数等于k时,序列中所有元素均为k的倍数,所以我们可以先统计每个位置前后连续元素为k的倍数的个数。

const q1 = new Array(nums.length).fill(0);
const q2 = new Array(nums.length).fill(0);
for(let i = 0; i < q1.length; i++){if(i == 0){if(nums[i] % k == 0) q1[i] = 1;if(nums[q2.length - 1] % k == 0) q2[q2.length - 1] = 1;}else{if(nums[i] % k == 0) q1[i] = q1[i-1] + 1;if(nums[q2.length - 1 - i] % k == 0) q2[q2.length - 1 - i] = q2[q2.length - i] + 1;}
}
  • 2、遍历找到两个相邻元素之间的最大公因数为k的位置;

如果一个序列中有两个元素的最大公因数为k,且其他元素均可以被k整除,那么这个序列所有元素的最大公因数也为k,所以我们可以找到任意一组最大公因数为k的元素来进行计算。

for(let i = 0; i < nums.length; i++){if(nums[i] == k) res++;if(i < nums.length - 1 && gcd(nums[i],nums[i + 1]) == k){……}
}
  • 3、计算当前位置可以组成满足条件的序列数。

如果找到一组相邻的元素他们的最大公因数为k,那么从当前位置向两边延伸,找到连续为k的倍数的元素组成的序列都为满足条件的序列。

如:nums = [3,3,4,1,2],k = 1

  • (1)、情况1(左边序列数 * 右边序列数 = 总序列数)

我们可以看到在下标i为1的时候,gcd(nums[i],nums[i + 1]) == k,此时从i往左看,我们可以得到两个连续元素均为k的倍数,[3,3];从i + 1往右看,我们可以得到三个连续元素均为k的倍数,[4,1,2]
我们只需计算两个数组的组合数即可,这里的子序列需要是连续的,所以我们可以得到的组合数应该是2 * 3 = 6;分别为:[3,4],[3,4,1],[3,4,1,2],[3,3,4],[3,3,4,1],[3,3,4,1,2];

  • (2)、情况2((左边序列数 - 上一次计算的左边序列数) * 右边序列数 = 总序列数)

第二个满足条件的下标i为2,此时从i往左看,我们可以得到两个连续元素均为k的倍数,[3,3,4];从i + 1往右看,我们可以得到三个连续元素均为k的倍数,[1,2]
我们只需计算两个数组的组合数即可,这里的子序列需要是连续的,所以我们可以得到的组合数应该是2 * 3 = 6;分别为:[4,1],[4,1,2],[3,4,1],[3,4,1,2],[3,3,4,1],[3,3,4,1,2],这时我们会发现,当前得出的结果与上一次得到的结果中有重复的子序列:[3,4,1],[3,4,1,2],[3,3,4,1],[3,3,4,1,2],因为左边的序列中[3,3]在上一次计算中已经计算过了,所以我们需要将这两个减去,可以得到(3 - 2) * 2 = 2,所以当前位置可以得到新的组合数为2;

  • (3)、子数组长度为1

题目中是这样定义的子数组:子数组 是数组中一个连续的非空序列。,所以在遇到nums[i] == k时,该元素可以单独成组。

let res = 0;
let flag = 0;
for(let i = 0; i < nums.length; i++){if(nums[i] == k) res++;if(i < nums.length - 1 && gcd(nums[i],nums[i + 1]) == k){res += (i > 0 ? (q1[i] - flag) : 1) * (q2[i + 1] || 1);flag = q1[i];}if(nums[i] % k !== 0) flag = 0;
}

完整AC代码如下:

AC代码

/*** @param {number[]} nums* @param {number} k* @return {number}*/var subarrayGCD = function(nums, k) {const gcd = (a, b) => {return a % b === 0 ? b : gcd(b, a % b);}const q1 = new Array(nums.length).fill(0);const q2 = new Array(nums.length).fill(0);for(let i = 0; i < q1.length; i++){if(i == 0){if(nums[i] % k == 0) q1[i] = 1;if(nums[q2.length - 1] % k == 0) q2[q2.length - 1] = 1;}else{if(nums[i] % k == 0) q1[i] = q1[i-1] + 1;if(nums[q2.length - 1 - i] % k == 0) q2[q2.length - 1 - i] = q2[q2.length - i] + 1;}}let res = 0;let flag = 0;for(let i = 0; i < nums.length; i++){if(nums[i] == k) res++;if(i < nums.length - 1 && gcd(nums[i],nums[i + 1]) == k){res += (i > 0 ? (q1[i] - flag) : 1) * (q2[i + 1] || 1);flag = q1[i];}if(nums[i] % k !== 0) flag = 0;}return res;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

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

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

相关文章

Python基础07-模块

零、文章目录 Python基础07-模块 1、模块是什么 Python 模块(Module)&#xff0c;是一个 Python 文件&#xff0c;以 .py 结尾&#xff0c;包含了 Python 对象定义和Python语句。模块能定义函数&#xff0c;类和变量&#xff0c;模块里也能包含可执行的代码。 2、模块的分类…

Netty常见的设计模式

简介 设计模式在软件开发中起着至关重要的作用&#xff0c;它们是解决常见问题的经过验证的解决方案。而Netty作为一个优秀的网络应用程序框架&#xff0c;同样也采用了许多设计模式来提供高性能和可扩展性。在本文中&#xff0c;我们将探讨Netty中使用的一些关键设计模式&…

云开发微信小程序实战

随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级的应用程序&#xff0c;逐渐成为了企业开展业务和提升用户体验的重要工具。而云开发则为企业提供了高效、安全、可靠的后台服务&#xff0c;使得小程序的开发和维护更加便捷。本文将详细介绍如何使用微信小程序与…

返回零长度的数组或集合,而不是null

返回零长度的数组或集合而不是 null 是一种良好的编程实践&#xff0c;可以提高代码的可靠性和可读性。以下是一个例子&#xff0c;展示了返回零长度的数组或集合的情况&#xff1a; import java.util.ArrayList; import java.util.List;public class StudentManager {private…

JavaWeb期末复习题

文章目录 一、单选题二、多选题三、填空四、判断题无、简答题六、程序分析题 一、单选题 1、HTML代表&#xff1f;&#xff08;C&#xff09; A、HighText机器语言 B、超文本和链接标记语言 C、超文本标记语言 D、都不是 2、用于启动网页的HTML标签的正确顺序是&#xff1f…

牛客第一期

1.创建动态数组 #include <iostream> using namespace std;int main() {int n; cin>>n; int *pnew int [n]; int i0; for(i0;i<n;i) {*(pi)ni; } int j0; for(j0;j<n;j) {printf("%d ",*(pj)); } } #include<bits/stdc.h> using namespace s…

网站提示“不安全”

当你在浏览网站时&#xff0c;有时可能会遇到浏览器提示网站不安全的情况。这通常是由于网站缺乏SSL证书所致。那么&#xff0c;从SSL证书的角度出发&#xff0c;我们应该如何解决这个问题呢&#xff1f; 首先&#xff0c;让我们简单了解一下SSL证书。SSL证书是一种用于保护网站…

python实战教学之python版“张万森,好久不见”

前言 WINTER IS COMING 最近《一闪一闪亮星星》的电影在火热预售中&#xff0c;家人们抢到票了嘛&#xff0c;前两天小编写了一篇“张万森&#xff0c;下雪了”的文章后&#xff0c;收到了不少小伙伴的反馈&#xff1a;“代码的运行结果只有文字&#xff0c;没有雪花啊”&#…

OceanBase数据库部署

文章目录 OceanBase基础概念集群、Zone和OB ServerRootService总控服务&#xff08;RS&#xff09;多租户机制&#xff1a;资源隔离&#xff0c;数据隔离每个租户拥有若干资源池&#xff08;Resource Pool&#xff09; 部署形式部署流程OceanBase客户端工具 学习体验部署实现 O…

通过fu过 Function Calling 查询数据库

from openai import OpenAI import os import json from dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # 读取本地 .env 文件&#xff0c;里面定义了 OPENAI_API_KE client OpenAI( api_keyos.getenv(“OPENAI_API_KEY”), base_urlos.getenv(“O…

unknown error 1146

Error 1146 in MySQL 是指找不到指定的数据库表。这个错误通常发生在你试图访问或操作一个不存在的数据库表时。 解决方式&#xff1a; 确保你使用的表名是正确的&#xff0c;检查拼写和大小写是否与数据库中的表名匹配。确保你正在使用正确的数据库。你可以使用以下命令切换到…

VSCode配置代码片段,提升效率必备!

1.点击文件—> 首选项------>配置用户代码片段 2、新建用户代码片段 3、以js的控制台输出为例 {//片段名称"console.log": {"prefix": "cls",//呼出命令"body": ["console.log($1)"//具体片段],"descriptio…

netty-daxin-3(rpc远程调用)

文章目录 nettyRpcObjectEncoder 与 ObjectDecoderjdk动态代理回顾Rpc调用过程简析服务端客户端 nettyRpc ObjectEncoder 与 ObjectDecoder ObjectEncoder继承自MessageToByteEncoder<Serializable>&#xff0c;它内部使用ByteBufOutputStream包装ByteBuf对象&#xff…

vue3项目中使用vue-cropper实现截图效果

前言&#xff1a; 自用&#xff01;&#xff01;&#xff01; 插件文档链接&#xff1a; https://www.npmjs.com/package/vue-cropper 使用步骤&#xff1a; 1、安装 npm install vue-cropper 2、项目中引入&#xff08;全局引入&#xff09;&#xff1b;文档中有介绍如何局…

怎么解决bash: composer: command not found问题

是不是遇到过bash: composer: command not found问题&#xff0c;怎么解决呢&#xff1f;下面由composer教程栏目给大家来详细介绍该问题的解决方法。 1、先看报错 2、由于错误的原因&#xff0c;安装很多东西都失败了。网上有的说是环境变量的问题&#xff0c;又一个个找也没…

DS考研真题总结——客观题(1)

开始整理真题中的客观小题&#xff0c;至于和算法有关的大题统一最后整理~ 定义背诵&#xff1a;数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效…

CAPL脚本获取电脑时间,并通过Message发送至总线

文章目录 前言一、CAPL获取时间的API1.timeNow():CANoe工程启动到执行到该函数的时间2.addTimeToMeasurementStartTime()3.void getLocalTime(long time[]):返回日期时间数组前言 在自动化开发中,无论是CAN通信测试,还是网络管理测试,亦或是休眠唤醒等等存在时间相关的,…

spring面试:二、bean的生命周期和循环引入问题(三级缓存、@Lazy)

bean的生命周期 Spring容器在进行实例化时&#xff0c;会将xml配置的的信息封装成一个BeanDefinition对象&#xff0c;Spring根据BeanDefinition来创建Bean对象&#xff0c;里面有很多的属性用来描述Bean。 其中比较重要的是&#xff1a; beanClassName&#xff1a;bean 的类…

tcp连接全过程各种状态详解

文章目录 TCP的一些重要特性tcp连接全过程各种状态参考资料 TCP的一些重要特性 TCP是一种可靠、面向连接、全双工、流控制、拥塞控制、有序传输、无差错传输、无重复传输、无丢失传输等特点的协议。为了实现这些特点&#xff0c;TCP必须对上层应用程序发送的数据进行分段、重组…

spring6 为集合类型属性赋值 --引用集合类型的bean

1.准备工作&#xff1a; Student.java package bean.dimap;import java.util.List; import java.util.Map;public class Student {private String sid;private String sname; //private Map<String,Teacher> map;//private List<Lesson> lessonList;public List&…