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;
    }
};
相关推荐
龙山云仓6 分钟前
No131:AI中国故事-对话荀子——性恶论与AI约束:礼法并用、化性起伪与算法治理
大数据·人工智能·深度学习·算法·机器学习
夏鹏今天学习了吗14 分钟前
【LeetCode热题100(90/100)】编辑距离
算法·leetcode·职场和发展
芒克芒克41 分钟前
数组去重进阶:一次遍历实现最多保留指定个数重复元素(O(n)时间+O(1)空间)
数据结构·算法
星火开发设计1 小时前
二维数组:矩阵存储与多维数组的内存布局
开发语言·c++·人工智能·算法·矩阵·函数·知识
丨康有为丨1 小时前
算法时间复杂度和空间复杂度
算法
HarmonLTS1 小时前
Python人工智能深度开发:技术体系、核心实践与工程化落地
开发语言·人工智能·python·算法
a程序小傲2 小时前
京东Java面试被问:RPC调用的熔断降级和自适应限流
java·开发语言·算法·面试·职场和发展·rpc·边缘计算
一分之二~2 小时前
二叉树--层序遍历(迭代和递归)
数据结构·c++·算法·leetcode
zl_vslam2 小时前
SLAM中的非线性优-3D图优化之绝对位姿SE3约束右扰动(十七)
人工智能·算法·计算机视觉·3d
Cestb0n2 小时前
某果app 加密校验算法逆向分析
python·算法·逆向安全