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
解题思路:
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;
}