leetcode 2654

2654: 使数组所有元素变成1 的最少操作次数

首先,如果所有数的 GCD(最大公约数)大于 1,那么无论如何都无法操作出 1,我们返回 −1。如果 nums 中有一个 1,那么从 1 向左向右不断替换就能把所有数变成 1。

如果 nums 中没有 1,想办法花费尽量少的操作得出一个 1。由于只能操作相邻的数,所以这个 1 必然是一个连续子数组的 GCD。(如果在不连续的情况下得到了 1,那么这个 1 只能属于其中某个连续子数组,其余的操作是多余的。)那么找到最短的 GCD 为 1 的子数组,设其长度为 minSize,那么我们需要操作 minSize−1 次得到 1。例如 [2,6,3,4] 中的 [3,4] 可以操作 2−1=1 次得到 1。

然后就转化成提示 1 中的情况了,最终答案为(minSize−1)+(n−1)=minSize+n−2

复制代码
gcd_all=gcd(gcd_all,x);

数学上规定:gcd(0, x) = |x| (任何整数与 0 的最大公约数都是它自身的绝对值)

复制代码
class Solution {
public:
    int minOperations(vector<int>& nums) {
        int n=nums.size();
        int gcd_all=0,cnt1=0; //数学上规定:gcd(0, x) = |x|
        for(int x :nums){
            gcd_all=gcd(gcd_all,x);
            if(x==1) cnt1++;
        }
        if(gcd_all>1) return -1;
        //如果 nums 中存在 1
        if(cnt1) return n-cnt1;

        int minSize=n;
        for(int i=0;i<n;i++){  //找最短的 GCD 为 1 的子数组
            int g=0;
            for(int j=i;j<n;j++){
                g=gcd(g,nums[j]);
                if(g==1){
                    minSize=min(minSize,j-i+1); //需要操作 minSize−1 次得到 1
                    break;
                }
            }
        }

        return minSize+n-2;
    }
};
相关推荐
搬砖者(视觉算法工程师)2 分钟前
计算机视觉与计算摄影测量学第三讲图像直方图:理论、统计特性与点运算变换
人工智能·算法·计算机视觉
Yingjun Mo7 分钟前
3. Meta-Harness:模型基座外壳的端到端优化
人工智能·算法
Cthy_hy9 分钟前
并查集(Disjoint Set Union):巧判「连通聚类关系」的极简利器
数据结构·算法
Shan120511 分钟前
C++中函数对象之重载 operator()
开发语言·c++·算法
逻辑君11 分钟前
物理生物学研究报告【20260007】
人工智能·算法
阿维的博客日记16 分钟前
简单说一下ArrayList的add机制,适合应试者表达的
算法·arraylist
阿Y加油吧36 分钟前
两道位运算 / 摩尔投票经典题复盘:只出现一次的数字 & 多数元素
数据结构·算法·leetcode
Evand J42 分钟前
【课题推荐】三模型IMM交互式多模型滤波算法,匀速/左转/右转目标跟踪,附MATLAB代码测试结果
算法·matlab·目标跟踪·无人机·imm·多模型
05候补工程师1 小时前
【408狂飙·数据结构】核心考点深度复盘:数组地址计算、特殊矩阵压缩存储与树的五大性质解题直觉
数据结构·笔记·线性代数·考研·算法·矩阵
青山师2 小时前
HashMap深度解析:哈希冲突、扩容机制与线程安全
算法·安全·哈希算法·java面试·hashmap源码