首页 > 其他分享 >3191. 使二进制数组全部等于 1 的最少操作次数 I

3191. 使二进制数组全部等于 1 的最少操作次数 I

时间:2024-10-18 10:12:21浏览次数:1  
标签:返回 3191 nums 二进制 元素 次数 数组 操作

给你一个二进制数组 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

解题思路:
1.遍历数组 nums,当遇到值为 0 的元素时:
如果该元素的位置在数组倒数第三个位置之后,则返回 -1,表示无法完成操作。
否则,将该元素及其后两个元素的值从 0 变为 1,并增加操作计数 ans。
2.最终返回操作次数 ans。

完整代码:
    /**
     * 计算将数组中的0全部替换为1所需的最小操作次数
     * 每次操作可以将连续的三个元素从0替换为1,或者从1替换为0
     * 如果数组中存在0,并且在数组的最后两个位置之前,则无法通过操作将所有0替换为1,返回-1
     * 
     * @param nums 输入的整数数组,包含0和1
     * @return 返回最小操作次数,如果无法将所有0替换为1,则返回-1
     */
    public int minOperations(int[] nums) {
        // 数组长度
        int n = nums.length;
        // 操作次数
        int ans = 0;
        // 遍历数组
        for (int i = 0; i < n; i++) {
            // 如果当前元素为0
            if (nums[i] == 0) {
                // 如果当前元素位置太靠后,无法进行连续三次操作,返回-1
                if (i > n - 3) {
                    return -1;
                }
                // 进行操作,将当前位置及其后两个位置的元素从0改为1,或从1改为0
                nums[i] = nums[i] == 0 ? 1:0;
                nums[i + 1] = nums[i + 1] == 0 ? 1:0;
                nums[i + 2] = nums[i + 2] == 0 ? 1:0;
                // 操作次数增加
                ans++;
            }
        }
        // 返回操作次数
        return ans;
    }

标签:返回,3191,nums,二进制,元素,次数,数组,操作
From: https://www.cnblogs.com/java-cheng/p/18473694

相关文章

  • 二维数组的简单用法
    publicclassIntArrayDemo{publicstaticvoidPrint(){for(inti=0;i<IntArray.Ints.Length;i++){Console.WriteLine(i);}}publicstaticvoidGetValue(......
  • 力扣349.两个数组的交集
    题目链接:349.两个数组的交集-力扣(LeetCode)给定两个数组 nums1 和 nums2 ,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2]示例2:输入:nums1=[4,9,5],nums2=[......
  • 每日OJ题_牛客_连续子数组最大和_线性dp_C++_Java
    目录牛客_连续子数组最大和_线性dp题目解析C++代码Java代码牛客_连续子数组最大和_线性dp连续子数组最大和_牛客题霸_牛客网(nowcoder.com)描述:        给定一个长度为 n的数组,数组中的数为整数。请你选择一个非空连续子数组,使该子数组所有数之和尽可能大,......
  • Java 一维数组作为函数参数
    //一维数组的引用#defineSIZE5voidinput(inta[],intlen);voidoutput(inta[],intlen);//函数的声明intmain(void){   inti=0;   intarr[SIZE]={86,85,85,896,45};//同理五个数据只是偶然,可能会更多   //输入   input(arr,SIZE);......
  • LeetCode 209 - 长度最小的子数组(滑动窗口法)
    题目描述给定一个含有n个正整数的数组和一个正整数target,我们要找出该数组中满足其总和大于等于target的长度最小的子数组,即子数组[nums_left,nums_right],并返回其长度。如果不存在符合条件的子数组,返回0。解题思路我们可以使用滑动窗口解决这道问题。初始化左指针......
  • (算法)最⻓湍流⼦数组————<动态规划>
    1.题⽬链接:978.最⻓湍流⼦数组2.题⽬描述:3.解法(动态规划):算法思路:1.状态表⽰:我们先尝试定义状态表⽰为:dp[i]表⽰「以i位置为结尾的最⻓湍流数组的⻓度」。 但是,问题来了,如果状态表⽰这样定义的话,以i位置为结尾的最⻓湍流数组的⻓度我们没法从之前的状态推导出......
  • 二进制凑数+路线规划构造题
    妙啊妙啊https://ac.nowcoder.com/acm/contest/92687/K#include<bits/stdc++.h>#defineendl'\n'#definelowbit(x)(x&-x)usingnamespacestd;constdoublepi=acos(-1);intpre[30];voidsolve(){intn;cin>>n;vector<int>......
  • 【数据结构】之数组详解
    数组是数据结构中最基础的概念之一,它在编程中被广泛应用。理解数组的工作原理、操作方式以及底层实现,对于我们构建更复杂的数据结构和算法至关重要。本文将从多个角度深入剖析数组,并以Java语言示例进行讲解,帮助你建立对数组的深刻理解。一、什么是数组?数组是一种线性数据结构......
  • 实验三: JavaScript数组与函数
    实验目的熟练掌握常用JavsScript的数组、自定义函数、作用域。实验内容数组定义及元素获取;数组的遍历;数组内容的增删改查;数组的排序;数组的反转、截取、合并、元素拼接函数的声明;函数的调用;匿名函数;作用域。实验步骤:数组定义及元素获取;数组的遍历;数组内容的增删改查......
  • C语言[数组作函数参数]
    输入10个整数作为一个数组,要求判断并且输出其中最大的值和它是数组中的第几位数。本次代码调用max函数数组元素为a[1]~a[9]代码如下:#include<stdio.h>intmain(){  intmax(intx,inty);  inti,m,n,a[10];  printf("enter10intergernumber:"); ......