【从零开始的LeetCode-算法】3191. 使二进制数组全部等于 1 的最少操作次数 I

给你一个二进制数组 nums

你可以对数组执行以下操作 任意 次(也可以 0 次):

  • 选择数组中 任意连续 3 个元素,并将它们 全部反转

反转 一个元素指的是将它的值从 0 变 1 ,或者从 1 变 0 。

请你返回将 nums 中所有元素变为 1 的 最少 操作次数。如果无法全部变成 1 ,返回 -1 。

示例 1:

**输入:**nums = [0,1,1,1,0,0]

**输出:**3

解释:

我们可以执行以下操作:

  • 选择下标为 0 ,1 和 2 的元素并反转,得到 nums = [++1++ ,++0++ ,++0++,1,0,0]
  • 选择下标为 1 ,2 和 3 的元素并反转,得到 nums = [1,++1++ ,++1++ ,++0++,0,0]
  • 选择下标为 3 ,4 和 5 的元素并反转,得到 nums = [1,1,1,++1++ ,++1++ ,++1++]

示例 2:

**输入:**nums = [0,1,1,1]

输出:-1

解释:

无法将所有元素都变为 1 。

提示:

  • 3 <= nums.length <= 105
  • 0 <= nums[i] <= 1

我的解答:

java 复制代码
class Solution {
    public int minOperations(int[] nums) {
        int size = nums.length;
        int res = 0;
        // 遍历除倒数最后两个以外的所有元素,因为最后两个元素不能单独反转
        for(int i = 0; i < size - 2; i++){
            // 如果当前索引元素为0,则该索引及后面两个元素都进行异或运算
            if(nums[i] == 0){
                nums[i] ^= 1;
                nums[i + 1] ^= 1;
                nums[i + 2] ^= 1;
                res++;
            }
        } 
        // 判断倒数最后两个元素是否都为1,是则返回操作次数,否则返回-1
        return nums[size - 1] + nums[size - 2] == 2 ? res : -1;
    }
}
相关推荐
卡尔特斯1 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源1 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole2 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫2 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide3 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261353 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源3 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
CoovallyAIHub3 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
Java中文社群3 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心4 小时前
从零开始学Flink:数据源
java·大数据·后端·flink