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

力扣(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表达式来获取


http://www.mrgr.cn/news/52673.html

相关文章:

  • px、rem、em等单位的区别
  • 【分布式微服务云原生】《解锁分布式锁的奥秘:由来、场景与技术大揭秘》
  • 晶体与晶振的区别
  • 华为杯”第十三届中国研究生数学建模竞赛-B题:具有遗传性疾病和性状的遗传位点分析(附MATLAB代码实现)
  • 【BGA布局布线-熬夜加班整理】
  • 网络编程基础-IO模型深入理解
  • Python酷库之旅-第三方库Pandas(157)
  • vs code 正则提取文本
  • Xamarin学习计划
  • JVM的基础
  • MyBatis Plus
  • Linux中pip安装python包失败原因是缺少python3-dev
  • C/C++逆向与反汇编01-寻找主函数
  • vue组件调用生命周期
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第十四集:制作新的场景以及制作创建切换管理系统
  • 详解Shell脚本与Ansible自动化工具差异
  • 为什么你总碰到渣男?伯克森悖论
  • 执行jar文件no main manifest attribute错误
  • 毕业设计选题:基于django+vue的个人博客系统设计与开发
  • Redis-2