当前位置: 首页 > article >正文

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

前言

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

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

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


http://www.kler.cn/news/362518.html

相关文章:

  • RootNeighboursDataset(helpers.dataset_classes文件中的root_neighbours_dataset.py)
  • 20240818 字节跳动 笔试
  • Miniconda3 Linux安装教程
  • 用户之认证
  • eCAP超声波测距-ePWM电机调速
  • 十二、【智能体】深入剖析:大模型节点的全面解读,举例说明,教你如何在扣子中嵌入代码
  • 6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss 方法与 hide 方法)
  • 【单元测试】深入解剖单元测试的思维逻辑
  • Nextjs Tailwind CSS 下载和配置
  • 027 elasticsearch查询数据-Java原生客户端
  • 前后端请求一致性学习
  • 解析NIO
  • 如何在 JavaScript 项目中限制Node.js版本
  • 【动手学电机驱动】 TI InstaSPIN-FOC(7)Lab05b 速度环控制
  • RabbitMQ进阶_可靠性
  • 大数据新视界 --大数据大厂之 Snowflake 在大数据云存储和处理中的应用探索
  • 网络安全的挑战与对策:从技术防御到综合治理的全方位分析
  • 阵痛中转型,商汤瘦身背后的AI真相
  • js如何获取一个object的第一条数据
  • Java设计模式——适配器模式
  • 开发面试题-更新中...
  • ansible.builtin 和 ansible.posix的区别
  • leetcode hot100 之【LeetCode 141. 环形链表】 java实现
  • sql注入 --二次注入堆叠注入文件读取getshell
  • Shiro 授权(Authorization)总结
  • swagger讲解