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;
    }
};
相关推荐
hetao17338373 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6264 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan4 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356385 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah5 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO95 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician5 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.6 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o6 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者7 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express