【优选算法必刷100题】第011~012题(同向双指针:滑动窗口算法):最大连续1的个数 III、将 x 减到 0 的最小操作数

【优选算法必刷100题】第011~012题(同向双指针:滑动窗口算法):最大连续1的个数 III、将 x 减到 0 的最小操作数

🔥艾莉丝努力练剑:个人主页

专栏传送门:《C语言》《数据结构与算法》C/C++干货分享&学习过程记录Linux操作系统编程详解笔试/面试常见算法:从基础到进阶

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬艾莉丝的简介:


🎬艾莉丝的算法专栏简介:



目录

011  最大连续1的个数 III

1.1  题目详解

1.2  算法原理以及代码实现

1.2.1  解法思路:滑动窗口

1.2.2  算法流程

1.2.3  代码实现

1.3  博主手记

012  将 x 减到 0 的最小操作数

2.1  题目详解

2.2  算法原理

2.2.1  解法思路:滑动窗口

2.2.2  算法流程

2.2.3  代码实现

2.3  博主手记

结尾


011  最大连续1的个数 III

力扣链接:1004. 最大连续1的个数 III

力扣题解链接:滑动窗口解决【最大连续1的个数III】问题

题目描述:

1.1  题目详解

1.2  算法原理以及代码实现

1.2.1  解法思路:滑动窗口

不要去想怎么翻转,不要把问题想的很复杂,这道题的结果无非就是一段连续的1中间塞了k个0。
因此,我们可以把问题转化成:求数组中一段最长的连续区间,要求这段区间内的个数不超过k个
既然是连续区间,可以考虑使用「滑动窗口」来解决问题。

1.2.2  算法流程

1、初始化一个大小为2的数组就可以当做哈希表(hash)了;初始化一些变量left = 0,right =0,ret = 0;

2、当right小于数组大小的时候,一直下列循环——

(1)让当前元素进入窗口,顺便统计到哈希表中;

(2)检查 0 的个数是否超标:

1)如果超标,依次让左侧元素滑出窗口,顺便更新哈希表的值,直到的个数恢复正
常;

(3)程序到这里,说明窗口内元素是符合要求的,更新结果;

(4)right++,处理下一个元素;

3、循环结束后,ret存的就是最终结果。

1.2.3  代码实现

class Solution { public: int longestOnes(vector<int>& nums, int k) { int ret = 0; for (int left = 0, right = 0, zero = 0; right < nums.size(); right++) { // 进窗口 if (nums[right] == 0) zero++; // 判断 while (zero > k) if (nums[left++] == 0) zero--; // 出窗口 // 更新结果 ret = max(ret, right - left + 1); } return ret; } };
时间复杂度:O(n),空间复杂度:O(1)。

1.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己推导很重要!


012  将 x 减到 0 的最小操作数

力扣链接:1658. 将 x 减到 0 的最小操作数

力扣题解链接:滑动窗口解决【将 x 减到 0 的最小操作数】问题

题目描述:

2.1  题目详解

2.2  算法原理

2.2.1  解法思路:滑动窗口

题目要求的是数组「左端+右端」两段连续的、和为x的最短数组,信息量稍微多一些,不易理清思路;我们可以转化成求数组内一段连续的、和为sum(nums) - x的最长数组。此时,就是熟悉的「滑动窗口」问题了。

这道题和我们介绍【滑动窗口】的第一道题目LCR 008. 长度最小的子数组有点像。

相关博客链接:【优选算法必刷100题】第009~010题(同向双指针:滑动窗口算法):长度最小的子数组、无重复字符的最长子串问题求解

2.2.2  算法流程

1、转化问题:求target = sum(nums) - x。如果target<0,问题无解;
2、初始化左右指针 l = 0,r = 0(滑动窗口区间表示为 [ l,r) ,左右区间是否开闭很重要,必须设定与代码一致),记录当前滑动窗口内数组和的变量sum=◎,记录当前满足条件数组的最大区间长度maxLen = -1;
3、当小于等于数组长度时,一直循环:

(1)如果sum<target,右移右指针,直至变量和大于等于target,或右指针已经移到头;
(2)如果sum>target,右移左指针,直至变量和小于等于target,或左指针已经移到头;
(3)如果经过前两步的左右移动使得sum == target,维护满足条件数组的最大长度,并
让下个元素进入窗口。

4、循环结束后,如果maxLen的值有意义,则计算结果返回;否则,返回 -1。

2.2.3  代码实现

class Solution { public: int minOperations(vector<int>& nums, int x) { int sum = 0; for (int a : nums)sum += a; int target = sum - x; //细节问题 if (target < 0)return -1; int ret = -1; for (int left = 0, right = 0, tmp = 0; right < nums.size(); right++)//tmp:和sum区分 { tmp += nums[right];//进窗口 //判断 while (tmp > target) tmp -= nums[left++];//出窗口 if (tmp == target)//更新结果 ret = max(ret, right - left + 1); } if (ret == -1)return ret; else return nums.size() - ret; } };
时间复杂度:O(n),空间复杂度:O(1)。

2.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己推导很重要!


结尾

往期回顾:

【优选算法必刷100题】第009~010题(同向双指针:滑动窗口算法):长度最小的子数组、无重复字符的最长子串问题求解

结语:看到这里,不要忘记给博主来个“一键四连”哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡

૮₍ ˶ ˊ ᴥ ˋ˶₎ა


Read more

WebToEpub实战指南:三步将网页小说变成随身电子书

WebToEpub实战指南:三步将网页小说变成随身电子书 【免费下载链接】WebToEpubA simple Chrome (and Firefox) Extension that converts Web Novels (and other web pages) into an EPUB. 项目地址: https://gitcode.com/gh_mirrors/we/WebToEpub 你是否曾经遇到过这样的情况:找到了一部精彩的网络小说,却因为网络不稳定无法畅快阅读?或者想要在通勤路上看小说,却担心流量消耗?今天,我将带你掌握WebToEpub这个神器,三步搞定网页转EPUB,让你的阅读体验从此无拘无束! 🔍 痛点分析:为什么你需要WebToEpub? 传统阅读方式的三大困扰: 1. 网络依赖强 - 必须在线才能阅读,断网就"剧终" 2. 阅读体验差

By Ne0inhk
Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务并全面实现无损语言壁垒交互 前言 在 OpenHarmony 应用向高性能计算领域扩展的过程中,如何优雅地接入已有的 C/C++ 算法库(如加密引擎、重型图像处理、数学模拟)而又不失跨平台的便捷性?传统的 NAPI 虽然稳健,但在 Flutter 生态中,直接利用 WebAssembly (WASM) 配合 FFI(External Function Interface)的语义可以在一定程度上实现代码的高度复用。wasm_ffi 库为 Flutter 开发者提供了一套在 Dart 环境下调用 WASM

By Ne0inhk
前端 Axios 深度封装实战:拦截器 + 文件处理 + 业务接口统一管理

前端 Axios 深度封装实战:拦截器 + 文件处理 + 业务接口统一管理

嘿,开发的小伙伴们!今天咱来好好唠唠Axios,这可是在前端数据请求领域相当火的一个工具库。我第一次用Axios的时候,就被它的简洁易用和强大功能给吸引住了,感觉像是找到了一个能帮我轻松搞定数据请求的得力助手。 注:章节 1-4 是通过 AI 生成的入门介绍,人工进行了审核和勘误,如已比较熟悉可跳过,章节 5 是纯人工创作,结合真实项目详细说明如何封装与使用。 一、Axios是什么 Axios本质上是一个基于Promise的HTTP客户端,主要用于浏览器和Node.js环境。它就像是一座桥梁,负责在前端应用和后端服务器之间传递数据。无论是向服务器发送GET、POST、PUT、DELETE等各种请求,还是处理服务器返回的响应,Axios都能轻松应对。 想象一下,你的前端应用就像一个热闹的集市,各种组件都需要从服务器获取数据来展示,比如商品信息、用户资料等等。Axios就是那个勤劳的“采购员”,它穿梭于集市(前端应用)和仓库(服务器)之间,按需获取数据,确保每个组件都能及时拿到所需信息。 二、Axios的特点 1. 简洁易用的API

By Ne0inhk
根据设计图生成前端代码,零基础入门到精通,收藏这篇就够了

根据设计图生成前端代码,零基础入门到精通,收藏这篇就够了

在现代前端开发中,从设计稿到可用页面的交付往往需要大量重复劳动:切图、手写样式、布局调整……而借助 MCP Server - Figma AI Bridge,我们可以将 Figma 设计稿自动转换成整洁的 HTML/CSS/JS 代码,并立即生成可预览的网页。一键化、傻瓜式操作,让设计交付效率跃升。 本文测试使用的系统环境如下: * Trae IDE 版本:2.4.5 * macOS 版本:14.7 * Node.js 版本:24.6.0 * npx 版本:11.5.2 * Python 版本:3.13.3

By Ne0inhk