995. K连续位的最小翻转次数

目录

  • 一、题目
  • 二、思路
    • 2.1 解题思路
    • 2.2 代码尝试
    • 2.3 疑难问题
  • 三、解法
      • 代码逻辑回顾
      • 示例运行过程
        • 初始状态:
        • 遍历过程:
      • 最终结果
      • 总结
  • 四、收获
    • 4.1 心得
    • 4.2 举一反三

一、题目

在这里插入图片描述

二、思路

2.1 解题思路

就是滑动窗口一个一个遍历,遇到情况就翻转。最后检查所有的是否还出现0.

2.2 代码尝试

class Solution {
public:int minKBitFlips(vector<int>& nums, int k) {int sum=0;int t=k;for(int i=0;i<=nums.size()-k;i++){if(nums[i]==1){continue;}else{if(k==1){nums[i]=1;}else{t=k;while(t>0){nums[i+t-1] & 1;t--;}}sum++;}}if(nums[nums.size()-1]==0){return -1;}return sum;}
};

翻转操作未正确实现:

你在 while(t>0) 循环中对 nums[i+t-1] 进行了按位与操作 & 1,但这个操作并没有实际改变 nums[i+t-1] 的值。你应该是想对数组元素进行翻转(0变1,1变0),但你没有实现这个逻辑。

边界条件处理不足:

你在最后检查了 nums[nums.size()-1] 是否为0,但如果在数组的末尾有多个0,你的代码可能无法正确处理。
在这里插入图片描述
这种就没法判断

时间复杂度较高:

你的代码在最坏情况下时间复杂度为 O(n*k),这在某些情况下可能会导致性能问题。

2.3 疑难问题

在这里插入图片描述
感觉思路没问题,但有边界问题
如何进行翻转0-1操作?如何减小时间复杂度?for循环太多了,感觉思路上还可以优化

三、解法

class Solution {
public:int minKBitFlips(vector<int>& nums, int k) {int n = nums.size();vector<int> diff(n + 1);int ans = 0, revCnt = 0;for (int i = 0; i < n; ++i) {revCnt += diff[i];if ((nums[i] + revCnt) % 2 == 0) {if (i + k > n) {return -1;}++ans;++revCnt;--diff[i + k];}}return ans;}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/minimum-number-of-k-consecutive-bit-flips/solutions/607416/k-lian-xu-wei-de-zui-xiao-fan-zhuan-ci-s-bikk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

好的!我们以数组 nums = [0, 0, 0, 1, 0, 1, 1, 0]k = 3 为例,逐步展示代码中主要变量的变化过程。


代码逻辑回顾

  1. diff 数组

    • 用于记录翻转操作的影响范围。
    • diff[i] 表示从位置 i 开始的翻转操作的影响。
  2. revCnt

    • 记录当前位置 i 的翻转次数(即当前处于多少次翻转的影响下)。
  3. ans

    • 记录总的翻转次数。
  4. 核心逻辑

    • 遍历数组,检查当前元素是否需要翻转。
    • 如果需要翻转,则更新 revCntdiff,并增加 ans

示例运行过程

初始状态:
nums = [0, 0, 0, 1, 0, 1, 1, 0]
n = 8
k = 3
diff = [0, 0, 0, 0, 0, 0, 0, 0, 0]  // 大小为 n + 1
ans = 0
revCnt = 0
遍历过程:
  1. i = 0

    • revCnt += diff[0]revCnt = 0
    • nums[0] + revCnt = 0 + 0 = 00 % 2 == 0,需要翻转。
    • 检查 i + k = 3 是否越界 → 3 <= 8,可以翻转。
    • 更新:
      • ans = 1
      • revCnt = 1
      • diff[3] = -1
    • 状态:
      diff = [0, 0, 0, -1, 0, 0, 0, 0, 0]
      ans = 1
      revCnt = 1
      
  2. i = 1

    • revCnt += diff[1]revCnt = 1 + 0 = 1
    • nums[1] + revCnt = 0 + 1 = 11 % 2 != 0,不需要翻转。
    • 状态:
      diff = [0, 0, 0, -1, 0, 0, 0, 0, 0]
      ans = 1
      revCnt = 1
      
  3. i = 2

    • revCnt += diff[2]revCnt = 1 + 0 = 1
    • nums[2] + revCnt = 0 + 1 = 11 % 2 != 0,不需要翻转。
    • 状态:
      diff = [0, 0, 0, -1, 0, 0, 0, 0, 0]
      ans = 1
      revCnt = 1
      
  4. i = 3

    • revCnt += diff[3]revCnt = 1 + (-1) = 0
    • nums[3] + revCnt = 1 + 0 = 11 % 2 != 0,不需要翻转。
    • 状态:
      diff = [0, 0, 0, -1, 0, 0, 0, 0, 0]
      ans = 1
      revCnt = 0
      
  5. i = 4

    • revCnt += diff[4]revCnt = 0 + 0 = 0
    • nums[4] + revCnt = 0 + 0 = 00 % 2 == 0,需要翻转。
    • 检查 i + k = 7 是否越界 → 7 <= 8,可以翻转。
    • 更新:
      • ans = 2
      • revCnt = 1
      • diff[7] = -1
    • 状态:
      diff = [0, 0, 0, -1, 0, 0, 0, -1, 0]
      ans = 2
      revCnt = 1
      
  6. i = 5

    • revCnt += diff[5]revCnt = 1 + 0 = 1
    • nums[5] + revCnt = 1 + 1 = 22 % 2 == 0,需要翻转。
    • 检查 i + k = 8 是否越界 → 8 <= 8,可以翻转。
    • 更新:
      • ans = 3
      • revCnt = 2
      • diff[8] = -1
    • 状态:
      diff = [0, 0, 0, -1, 0, 0, 0, -1, -1]
      ans = 3
      revCnt = 2
      
  7. i = 6

    • revCnt += diff[6]revCnt = 2 + 0 = 2
    • nums[6] + revCnt = 1 + 2 = 33 % 2 != 0,不需要翻转。
    • 状态:
      diff = [0, 0, 0, -1, 0, 0, 0, -1, -1]
      ans = 3
      revCnt = 2
      
  8. i = 7

    • revCnt += diff[7]revCnt = 2 + (-1) = 1
    • nums[7] + revCnt = 0 + 1 = 11 % 2 != 0,不需要翻转。
    • 状态:
      diff = [0, 0, 0, -1, 0, 0, 0, -1, -1]
      ans = 3
      revCnt = 1
      

最终结果

  • 总翻转次数 ans = 3
  • 最终数组状态(如果实际翻转):
    nums = [1, 1, 1, 1, 1, 1, 1, 1]
    

总结

通过这个例子,我们可以看到:

  1. diff 数组用于记录翻转操作的影响范围。
  2. revCnt 用于动态计算当前位置的翻转次数。
  3. 每次翻转操作都会更新 diffrevCnt,从而高效地处理区间翻转。

希望这个详细的例子能帮助你理解代码的运行过程!如果还有疑问,欢迎继续提问!

四、收获

4.1 心得

0-1翻转可以使用异或操作
^= 1
太难了,这道题
用一个标记符号和差分数组。差分数组的累加代表当前元素值
当前元素与标记符号的和,如果是偶数,代表需要翻转。标记符号是1,代表已经翻转的状态。如果元素为1,。标记符号为0,代表未翻转,若元素为0,那么就需要进行翻转的操作,并将范围之外的第一个元素的差分数组置为-1。因为置为-1,这样范围之外的第一个元素与标记符相加,才能重新使得标记符变为0,回到未翻转的状态。
这么精妙的思路,第一次做完全想不到。我只会暴力贪心。但是感觉标记符号和差分数组也是一种模板的公式化解题思路,可能做多了就知道。

4.2 举一反三

遇到0-1翻转的这种需要频繁更新值的,使用标记符号和差分数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13904.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署LLM模型到云端

文章目录 1 ECS 云服务器部署2 函数计算FC3 人工智能平台PAI-EAS4 大模型服务平台百炼压测实验结果显示,由于本地设备算力有限,本地部署的模型服务无法满足低延迟和高并发的需求。针对这类线上业务,可以考虑云端部署。 下面先来看看本地部署和云端部署的特点对比。 由上可…

【python】简单的flask做页面。一组字母组成的所有单词。这里的输入是一组字母,而输出是所有可能得字母组成的单词列表

目录结构如下&#xff1a; . ├── static │ ├── css │ │ └── styles.css │ └── js │ └── scripts.js ├── templates │ ├── base.html │ ├── case_converter.html │ ├── index.html │ └── word_finder.html ├── app.py ├── tree.py…

intra-mart实现简易登录页面笔记

一、前言 最近在学习intra-mart框架&#xff0c;在此总结下笔记。 intra-mart是一个前后端不分离的框架&#xff0c;开发时主要用的就是xml、html、js这几个文件&#xff1b; xml文件当做配置文件&#xff0c;html当做前端页面文件&#xff0c;js当做后端文件&#xff08;js里…

0008—常量和变量

目录 一、变量 1.1 定义变量的方法 1.2 变量的分类 1.3 使用变量 1.4 变量的作用域 1.5 变量的生命周期 二、常量 2.1 字面常量 2.2 const修饰的常变量 2.3 define定义的标识符常量 2.4 枚举常量 三、练习 一、变量 生活中的有些值是不变的&#xff08;比如&#…

【Vue】在Vue3中使用Echarts的示例 两种方法

文章目录 方法一template渲染部分js部分方法一实现效果 方法二template部分js or ts部分方法二实现效果 贴个地址~ Apache ECharts官网地址 Apache ECharts示例地址 官网有的时候示例显示不出来&#xff0c;属于正常现象&#xff0c;多进几次就行 开始使用前&#xff0c;记得先…

[Deepseek-自定义Ollama 安装路径+lmStudio 简易安装]

ollama 先下载 https://ollama.org.cn/download 使用 发现报错 检查路径 自己的路径! 再用 .\OllamaSetup.exe /DIRE:\MySoftware\Ollama 删除掉 多余模型 ollama delete <model_name> 例如 ollama delete deepseek-r1:1.5b 下载 ollama run deepseek-r1:1.5b…

Linux 内核模块 | 加载 / 添加 / 删除 / 优先级

注&#xff1a;本文为 “Linux 内核模块加载 / 添加 / 删除 / 优先级” 相关文章合辑。 机翻&#xff0c;未校。 未整理去重。 How Linux Kernel Boots? Linux 内核如何启动&#xff1f; Last Updated: 26 Apr, 2023 Many processes are running in the background when …

鸿蒙UI(ArkUI-方舟UI框架)- 使用文本

返回主章节 → 鸿蒙UI&#xff08;ArkUI-方舟UI框架&#xff09; 文本使用 文本显示 (Text/Span) Text是文本组件&#xff0c;通常用于展示用户视图&#xff0c;如显示文章的文字内容。Span则用于呈现显示行内文本。 创建文本 string字符串 Text("我是一段文本"…

ubuntu20使用tigervnc远程桌面配置记录

一、安装tigervnc sudo apt install tigervnc-common sudo apt install tigervnc-standalone-server二、增加配置文件 安装完后新增配置文件&#xff1a;vim ~/.vnc/xstartup #!/bin/sh #Uncomment the following two lines for normal desktop: #unset SESSION_MANAGER #ex…

如何使用el-table的多选框

对el-table再次封装&#xff0c;使得功能更加强大&#xff01; 本人在使用el-table时&#xff0c;因为用到分页&#xff0c;导致上一页勾选的数据在再次返回时&#xff0c;没有选中&#xff0c;故在原有el-table组件的基础之上再次进行了封装。 1.首先让某些不需要勾选的列表进…

【银河麒麟高级服务器操作系统】系统日志Call trace现象分析及处理全流程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://document.kylinos.cn 服务器环境以及配置 系统环境 物理机/虚拟机/云…

杭州某小厂面试

问的都是基础知识&#xff0c;主要是三个部分&#xff1a;计网&#xff0c;数据库&#xff0c;java。计网答得挺好&#xff0c;数据答得一般&#xff0c;Java答得一坨。 目录 1.TCP/IP协议的5层模型 2.3次握手和4次挥手 3.操作系统中的进程和线程的区别 4.lunix top 命令看…

k8s网络插件及基础命令

一、k8s的cni网络插件 1.k8s的内部网络模式 pod内的容器与容器之间的通信。一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。不同节点上的pod之间的通信&#xff1a;通过物理网卡的ip地址和其他节点上的物理网卡的设备进行通信&#xff0c;然后把流量转发到指定的…

Zookeeper是如何解决脑裂问题的?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper是如何解决脑裂问题的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Zookeeper是如何解决脑裂问题的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过多种机制来解决脑裂&…

判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0

要判断您的Mac当前使用的是Zsh还是Bash&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…

web直播弹幕抓取分析 signature

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言 最近遇到太多难点了卡了很久&am…

使用Deepseek搭建本地知识库-Cherry Studio

Cherry Studio 支持多模型服务的 Windows/macOS GPT 客户端 GITHUB&#xff1a;CherryHQ/cherry-studio CSDN资源&#xff1a;cherry studio Cherry Studio 是一个支持多模型服务的桌面客户端&#xff0c;为专业用户而打造&#xff0c;内置 30 多个行业的智能助手&#xff0c…

Node.js 环境配置

什么是 Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript。传统上&#xff0c;JavaScript 主要用于浏览器中的前端开发&#xff0c;而 Node.js 使得 JavaScript 也能够在服务器上执行&#xff0c;…

面向对象程序设计-实验2

题目1 6-1 使用动态内存分配的冒泡排序。 代码清单&#xff1a; #include <iostream> using namespace std; int* bubble_sort(int n);/* 对长度为n的数组执行冒泡排序 */ int main() { int n; cin >> n; int* a bubble_sort(n); for (int i 0; i < n; i)…

集成Google Maps页面提示[For development purposes only]解决方案

问题描述 填写Google Maps JavaScript API密钥之后(https://console.cloud.google.com/apis/credentials/key/2fb9924f-4dc6-4e77-b26f-085b67f48ae0?inv=1&invt=Abo68g&project=deft-velocity-450208-t8),加载Google Maps JavaScript API会出现这样的显示: 问题…