2025.11.12 力扣每日一题

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

题目分析

题目要求:通过 "选择下标 i,将 nums[i]nums[i+1] 替换为它们的最大公约数(gcd)" 的操作,让数组所有元素变成 1,求最少操作次数 ;若无法实现,返回 -1

核心逻辑:

  • 操作的本质是通过相邻元素的 gcd 逐步生成 1 (因为只有 gcd 为 1 时,才能生成 1)。
  • 若数组所有元素的整体 gcd 大于 1(即 gcd(nums[0], nums[1], ..., nums[n-1]) > 1),则无法生成 1,直接返回 -1
  • 若数组中已有 1,则只需将所有非 1 元素替换为 1,操作次数为 n - 1的个数
  • 若数组中没有 1,则需要先找到最短的连续子数组,其 gcd 为 1 (记子数组长度为 len),再通过该子数组生成 1,然后将剩余元素替换为 1,总操作次数为 len - 1 + (n - 1)

示例理解(以示例 1 nums = 2,6,3,4 为例)

数组中无 1,且整体 gcd 为 gcd(2,6,3,4)=1,进入步骤 3。

遍历子数组:

子数组 3,4 的 gcd 是 1,长度为 2,j - i = 1(min_size=1)。

总操作次数:1 + 4 - 1 = 4,与示例输出一致。

cpp 复制代码
class Solution {
public:
    int minOperations(vector<int>& nums) {
        //步骤 1:判断是否存在 "全局无法生成 1" 的情况
        //gcd_all 是数组所有元素的最大公约数。若 gcd_all > 1,说明所有元素都是 gcd_all 的倍数,永远无法生成 1,直接返回 -1。
        int n = nums.size(), gcd_all = 0, cnt1 = 0;
        for (int x : nums) {
            gcd_all = gcd(gcd_all, x);//计算数组所有元素的整体gcd
            cnt1 += x == 1;         //统计数组中1的个数
        }
        if (gcd_all > 1)
            return -1;//整体gcd>1,无法生成1
        //步骤 2:处理 "数组中已有 1" 的情况
        //若数组中存在 1,则每个非 1 元素都可以通过与相邻 1 取 gcd 变为 1,操作次数为 数组长度 - 1的个数。
        if (cnt1)
            return n - cnt1;
        //步骤 3:处理 "数组中没有 1" 的情况
        int min_size = n;
        //遍历所有可能的子数组 nums[i..j],计算其 gcd,找到最短的 gcd 为 1 的子数组(长度为 len = j - i + 1,代码中 j - i 是 len - 1)
        for (int i = 0; i < n; i++) {
            int g = 0;
            for (int j = i; j < n; j++) {
                g = gcd(g, nums[j]);// 计算从i到j的子数组的gcd
                if (g == 1) {
                    // 记录最短gcd为1的子数组长度(j-i+1的长度,这里j-i是"长度-1")
                    min_size = min(min_size, j - i);
                    break;
                }
            }
        }
        //生成 1 需要 len - 1 次操作(将子数组逐步通过 gcd 生成 1),之后将剩余 n - 1 个元素替换为 1,总操作次数为 (len - 1) + (n - 1) = min_size + n - 1(因为 min_size = len - 1)。
        return min_size + n - 1;
    }
};
相关推荐
测试199827 分钟前
如何用appium搭建Android自动化测试框架?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
203号居民1 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾2 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP2 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin3 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
Tim_103 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
船厂电气自动化ai大模型4 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳4 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了6664 小时前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法
靠沿5 小时前
贪心算法专题(三)
算法·贪心算法