leetcode
100346. 使二进制数组全部等于 1 的最少操作次数 II

问题描述

LeetCode 100346. 使二进制数组全部等于 1 的最少操作次数 II (opens in a new tab),难度中等

给你一个二进制数组 nums

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

  • 选择数组中 任意 一个下标 i ,并将从下标 i 开始一直到数组末尾 所有 元素 反转

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

请你返回将 nums 中所有元素变为 1 的 最少 操作次数。

示例 1

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

输出:4

解释:
我们可以执行以下操作:

选择下标 i = 1 执行操作,得到 nums = [0,0,0,1,0] 。
选择下标 i = 0 执行操作,得到 nums = [1,1,1,0,1] 。
选择下标 i = 4 执行操作,得到 nums = [1,1,1,0,0] 。
选择下标 i = 3 执行操作,得到 nums = [1,1,1,1,1] 。

示例 2

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

输出:1

解释:
我们可以执行以下操作:

选择下标 i = 1 执行操作,得到 nums = [1,1,1,1] 。

提示:

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

题解

遍历

解题思路:参考 100344. 使二进制数组全部等于 1 的最少操作次数 I (opens in a new tab) 这题,我们只需要判断 nums 可以被分成几段连续的 0 或者 1,被分成的段数则接近于我们所需要的答案。

这时,我们还需要考虑第一段是否为 1,如果为 1,则我们只需要从第二段开始反转,所以我们初始化 result = 1 - nums[0]

Solution.java
class Solution {
    public int minOperations(int[] nums) {
        // 判断第一段连续相同的数字是否为 1
        int result = 1 - nums[0];
        for (int i = 1; i < nums.length; ++i) {
            // 判断有几段连续相同的子数组
            if (nums[i - 1] != nums[i]) {
                result++;
            }
        }
        return result;
    }
}