力扣(leetcode)每日一题 3191 使二进制数组全部等于 1 的最少操作次数 I |贪心
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**]
。
题解
public static int minOperations(int[] nums) { int res = 0; for (int i = 0; i < nums.length - 2; i++) { if ((nums[i] & 1) == 0) { res++; nums[i] = 1; if ((nums[i + 1] & 1) == 0) { nums[i + 1] = 1; } else { nums[i + 1] = 0; } if ((nums[i + 2] & 1) == 0) { nums[i + 2] = 1; } else { nums[i + 2] = 0; } } // 说明是1 跳过 } if ((nums[nums.length - 1] & 1) == 1 && (nums[nums.length - 2] & 1) == 1) { return res; } return -1;
}
总结
这个写法是猜的。虽然不知道为什么,但是肯定当前为0的时候进行翻转的贪心策略最终肯定是翻转次数最少的。背后的数学原理我也不懂,但是可以猜测和尝试。
1改成0,0改成1 ,可以使用1-x表达式来获取