【LeetCode】每日一题 2024_10_18 使二进制数组全部等于 1 的最少操作次数 I(贪心)

时间:2024-10-19 08:01:20

前言

每天和你一起刷 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,前面遍历过的元素默认已经进行了反转操作)

每天进步一点点,我们明天不见不散~

可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。