【LeetCode】:最长乘积等价子数组【简单】

news2025/1/8 3:22:01

https://leetcode.cn/problems/maximum-subarray-with-equal-products/description/
在这里插入图片描述
以下是解决这道题的详细思路:

一、理解题目要求

  1. 题目给定一个由正整数组成的数组 nums,需要找出其中最长的“乘积等价子数组”的长度。
  2. 一个数组 arr 被称为“乘积等价数组”,当且仅当 prod(arr) == lcm(arr) * gcd(arr),其中:
    • prod(arr) 表示 arr 中所有元素的乘积。
    • gcd(arr) 表示 arr 中所有元素的最大公因数(GCD)。
    • lcm(arr) 表示 arr 中所有元素的最小公倍数(LCM)。
  3. 子数组是数组中连续的、非空的元素序列。

二、解题方法

  1. 暴力解法(遍历所有子数组)

    • 两层循环遍历数组 nums,外层循环 i0nums.length - 1,表示子数组的起始位置。
    • 内层循环 jinums.length - 1,表示子数组的结束位置。
    • 对于每个子数组 nums[i]nums[j],计算其 prod(乘积)、gcd(最大公因数)和 lcm(最小公倍数)。
    • 判断是否满足 prod == lcm * gcd,如果满足,更新最长子数组的长度。
    • 时间复杂度: O ( n 3 ) O(n^3) O(n3),其中 n 是数组 nums 的长度。因为需要遍历所有可能的子数组,对于每个子数组又需要计算 prodgcdlcm,计算 gcdlcm 的时间复杂度为 O ( n ) O(n) O(n),所以总的时间复杂度较高。
  2. 优化解法(利用数学性质和滑动窗口)

    • 首先,根据数学性质:对于两个数 ab,有 a * b = gcd(a, b) * lcm(a, b)。推广到多个数,如果一个子数组是“乘积等价子数组”,那么该子数组中任意两个数的乘积也等于它们的 gcdlcm 的乘积。
    • 基于此,我们可以使用滑动窗口的方法。
    • 初始化两个指针 leftright 都指向数组的起始位置 0,以及一个变量 maxLen 用于记录最长子数组的长度,初始化为 0
    • 移动 right 指针,逐步扩大窗口。
    • 在每次移动 right 指针后,计算当前窗口内元素的 prodgcdlcm
    • 如果满足 prod == lcm * gcd,则更新 maxLenmax(maxLen, right - left + 1),然后尝试移动 left 指针,缩小窗口,看是否能找到更长的满足条件的子数组。
    • 如果不满足条件,则继续移动 right 指针,扩大窗口。
    • 时间复杂度: O ( n ) O(n) O(n),因为每个元素最多被 leftright 指针访问两次,计算 gcdlcm 的时间复杂度为 O ( n ) O(n) O(n),但总体上时间复杂度得到了优化。

三、示例分析(以示例1为例)

  • 输入 nums = [1,2,1,2,1,1,1]
    • 从起始位置开始,逐步扩大窗口:
    • 当窗口为 [1] 时,prod = 1gcd = 1lcm = 1,满足条件,maxLen = 1
    • 当窗口为 [1,2] 时,prod = 2gcd = 1lcm = 2,满足条件,maxLen = 2
    • 当窗口为 [1,2,1] 时,prod = 2gcd = 1lcm = 2,满足条件,maxLen = 3
    • 当窗口为 [1,2,1,2] 时,prod = 4gcd = 1lcm = 4,满足条件,maxLen = 4
    • 当窗口为 [1,2,1,2,1] 时,prod = 4gcd = 1lcm = 4,满足条件,maxLen = 5
    • 继续移动 right 指针,后续窗口都不满足条件,所以最终 maxLen = 5,输出 5

综上所述,通过优化解法(滑动窗口)可以更高效地解决这道题,找到最长的“乘积等价子数组”的长度。

最大公约数(GCD)和最小公倍数(LCM)是两个数论中的重要概念,它们之间存在着密切的联系,具体如下:

一、基本定义

  • 最大公约数:指两个或多个整数共有约数中最大的一个。例如,12 和 18 的公约数有 1、2、3、6,其中最大公约数是 6。
  • 最小公倍数:指两个或多个整数公有的倍数中最小的一个。例如,12 和 18 的公倍数有 36、72、108 等,其中最小公倍数是 36。

二、两者联系

  • 数学公式关系:对于两个正整数 a a a b b b,它们的乘积等于它们的最大公约数与最小公倍数的乘积,即 a × b = GCD ( a , b ) × LCM ( a , b ) a\times b = \text{GCD}(a,b) \times \text{LCM}(a,b) a×b=GCD(a,b)×LCM(a,b)

例如,对于 4 和 6, 4 × 6 = 24 4\times6 = 24 4×6=24,4 和 6 的最大公约数是 2,最小公倍数是 12, 2 × 12 = 24 2\times12 = 24 2×12=24,满足上述公式。

三、实际应用中的体现

  • 分数化简:在化简分数时,需要找到分子和分母的最大公约数,然后将分子分母同时除以最大公约数,得到最简分数。而最简分数的分母实际上就是原分子分母的最小公倍数的约数。例如,化简 12 18 \frac{12}{18} 1812,先求出 12 和 18 的最大公约数是 6,化简后为 2 3 \frac{2}{3} 32,3 是 12 和 18 的最小公倍数 36 的约数。
  • 周期性问题:在一些具有周期性的问题中,最大公约数和最小公倍数也有重要应用。比如,有两个周期性事件,一个周期为 a a a 天,另一个周期为 b b b 天,那么它们同时发生的周期就是 a a a b b b 的最小公倍数,而在这个周期内,它们共同发生的次数与最大公约数有关。

总之,最大公约数和最小公倍数相互关联,在数论、代数、实际生活中的很多问题解决中都起着关键作用,帮助我们更好地理解和处理整数之间的关系和运算。

class Solution {
public:
    int maxLength(vector<int>& nums) {
        int n = nums.size();
        int ret = 0;
        for (int i = 0; i < n; i++) {
            unsigned long long prod = nums[i], l = nums[i], g = nums[i];
            if (prod == l * g) {
                ret = max(ret, 1);
            }
            for (int j = i + 1; j < n; j++) {
                prod *= nums[j];
                if (prod > ULONG_LONG_MAX) {
                    break;
                }
                l = (l * nums[j]) / gcd(l, nums[j]);
                g = gcd(g, nums[j]);
                if (prod == l * g) {
                    ret = max(ret, j - i + 1);
                }
            }
        }
        return ret;
    }
};

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

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

相关文章

Android使用DataBinding和Merge引发的血案

Android使用DataBinding和Merge引发的血案 1.前言&#xff1a; 相信Databinding和Merge大家都不陌生&#xff0c;今天讲解的是Databinding和Merge一起使用遇到的问题&#xff0c;在父布局使用&#xff0c;引用的布局使用Merge会导致id找不到&#xff0c;运行时直接崩溃了&…

JS (node) 的 ACM 模式 + debug方法 (01背包为例)

文章目录 JS 的 ACM 模式输入处理 JS dubug (01背包为例)动态输入在本地通过 Node.js 运行和调试 硬编码 Hard CodingVS Code JS 的 ACM 模式 在 JavaScript 中&#xff0c;ACM 模式一般通过 Node.js 的 readline 模块实现。 输入处理 使用 readline 模块监听输入。 将每行输…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…

HTML——56.表单发送

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表单发送</title></head><body><!--注意&#xff1a;1.表单接收程序&#xff0c;放在服务器环境中(也就是这里的www文件目录中)2.表单发送地址&#x…

el-table行列转换简单版,仅限单行数据

原始数据格式如下&#xff0c;如果不是此格式&#xff0c;请转换成以下格式在进行以下操作 [{ label: name, value: Tom },{ label: age, value: 25 },{ label: country, value: UK } ]代码如下 <template><el-table :data"tableData" style"width: …

OpenGL材质系统和贴图纹理

上一篇文章当中笔者为大家介绍了风氏光照模型&#xff0c;相信大家也发现了光照着色器当中有设置有很多控制光照强度的参数&#xff0c;而所谓的材质系统就是我们可以人为的去调节这些参数&#xff0c;让一个物体的反光效果能够更加接近我们现实生活当中的一些物体。 材质系统…

【mybatis】Mybatis整体架构解析

从本篇开始我们开始学习mybatis的系列源码&#xff0c;主要的主题可能就是四个方面 从整体把握mybatis系统架构通过一个查询SQL 源码解析核心流程mybatis的缓存机制-源码级别mybatis的插件机制-源码级别spring是如何整合的mybatis框架的 1.整体架构 上述是mybatis的源码&…

stm32 智能语音电梯系统

做了个stm32智能语音控制的电梯模型&#xff0c;总结一下功能&#xff0c;源码用ST的HAL库写的&#xff0c;整体流程分明。 实物图 这个是整个板子的图片&#xff0c;逻辑其实并不复杂&#xff0c;只是功能比较多&#xff0c;在我看来都是一些冗余的功能&#xff0c;但也可能是…

Git 部署

参考&#xff1a;手把手教你入门Git — Git使用指南&#xff08;Linux&#xff09; 需要说明的是&#xff1a; 1、服务器linux系统中一般使用master分支&#xff0c;但github现在流行的是main分支&#xff1b; 解决方案是修改master分支位main分支 git branch -m master mai…

【业务场景】sql server从Windows迁移到Linux

目录 1.背景 2.Linux安装sql server 3.服务器不开端口的问题 4.数据库导入导出问题 1.背景 博主在24年年底接手运维了一个政府的老系统&#xff0c;整个应用和数据库单点部署在一台Windows Server服务器上&#xff0c;数据库选型是经典的老项目标配——sql server。随着近…

《Vue3实战教程》35:Vue3测试

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 测试​ 为什么需要测试​ 自动化测试能够预防无意引入的 bug&#xff0c;并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…

字玩FontPlayer开发笔记6 Tauri2设置菜单

字玩FontPlayer开发笔记6 Tauri2设置菜单 字玩FontPlayer是笔者开源的一款字体设计工具&#xff0c;使用Vue3 ElementUI开发&#xff0c;源代码&#xff1a; github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontplayer 笔记 字玩目…

我用AI学Android Jetpack Compose之开篇

最近突发奇想&#xff0c;想学一下Jetpack Compose&#xff0c;打算用Ai学&#xff0c;学最新的技术应该要到官网学&#xff0c;不过Compose已经出来一段时间了&#xff0c;Ai肯定学过了&#xff0c;用Ai来学&#xff0c;应该问题不大&#xff0c;学习过程记录下来&#xff0c;…

Zookeeper是如何保证事务的顺序一致性的?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper是如何保证事务的顺序一致性的?】面试题。希望对大家有帮助&#xff1b; Zookeeper是如何保证事务的顺序一致性的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过多个机制来保证事务的顺序一…

机器人手眼标定

机器人手眼标定 一、机器人手眼标定1. 眼在手上标定基本原理2. 眼在手外标定基本原理 二、眼在手外标定实验三、标定精度分析 一、机器人手眼标定 要实现由图像目标点到实际物体上抓取点之间的坐标转换&#xff0c;就必须拥有准确的相机内外参信息。其中内参是相机内部的基本参…

数据挖掘——聚类

数据挖掘——聚类 聚类K-meansKNN VS K-meansK-Nearest Neighbors (KNN)K-means K中心算法PAM算法 K-modes算法——解决数据敏感的问题KMeans算法 ——解决初始点选择问题K-中心点层次方法AGNES算法——最小距离单链接全链接平均链接 聚类评估K均值和K中心点的优缺点层次化聚类…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象&#xff0c;有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据&#xff1a; 获取session获取数据&#xff1a; 请求存储&#xff1a; 请求获取&#xff1a; 数据正常打印&#xff1a…

GPT系统重大升级,开创国内先河:o1支持图片识别功能正式上线

文章目录 零、前言一、授权码登录体验优化&#xff1a;一步直达聊天界面二、全新“项目”功能&#xff1a;让工作更有条理三、语音功能升级&#xff1a;全新交互体验四、o1支持图片识别五、总结 零、前言 我是虚竹哥&#xff0c;目标是带十万人玩转ChatGPT。 亲爱的用户&…

unity 播放 序列帧图片 动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、方法一&#xff1a;代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二&#xff1a;直接使用1.Image上添加…

VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景 1.一只相机取像位置固定&#xff0c;或者多只相机固定位置拍图&#xff0c;硬拷贝拼图&#xff0c;采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照&#xff0c;相机视野互相重叠&#xff0c;基于Patmax特征定位后&#xff0c;无缝 拼图&#xff…