前言
每天和你一起刷 LeetCode 每日一题~
LeetCode 启动!
题目:使二进制数组全部等于 1 的最少操作次数 I
昨天的题目写不出来 . . . 如果我哪一天突然断更了,不用怀疑,就是那天的每日一题我写不了一点呜呜
代码与解题思路
今天的题目可以说是贪心,也可以说是脑筋急转弯,只要想到就很容易把代码写出来 . . . 不过老规矩,先读读题目
题目让我们:
选择数组中任意 连续 3 个元素,并将它们全部反转
返回能将数组变成 1 的最少次数,如果失败就返回 -1
核心思路:
因为我们要反转的是连续的三个元素,而数组所有元素要变成 1,只有一种解法,那就是从左往右遍历找所有的 0,然后全部进行反转,走过的位置不再重复遍历,保证元素都是 1
遇到 0 就反转,假设遍历到最后并不能让数组全为 1,那无论怎么反转都不能让数组变为 1 了。
思路略抽象,但是思考模拟一下就也比较容易理解。
func minOperations(nums []int) (ans int) {
n := len(nums)
for i, v := range nums[:n-2] {
if v == 0 {
nums[i] = 1
nums[i+1] ^= 1
nums[i+2] ^= 1
ans++
}
}
if nums[n-2] == 0 || nums[n-1] == 0 {
return -1
}
return ans
}
补充:
反转 0 和 1 的小技巧,可以直接用异或 1 的操作:相同为 0,相异为 1。假设原数字是 1,那相同为 0 就反转成 0;假设原数字为 0,相异为 1 就反转成 1 了。
(PS:其实代码中 nums[i] = 1 是多余的,因为最后的判断只看倒数后两个元素是否为 0,前面遍历过的元素默认已经进行了反转操作)
每天进步一点点,我们明天不见不散~
可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。