优选算法——双指针专题 1.移动零 2.复写零

优选算法——双指针专题 1.移动零 2.复写零

优选算法——双指针专题 1.移动零 2.复写零

一.移动零

[题目传送门](283. 移动零 - 力扣(LeetCode))

1.题目描述

在这里插入图片描述

2.算法原理

数组划分 数组分块

什么意思呢?就是把数组按要求划分模块

比如这道题,就是把数组划分成两个模块,前边是非0,后边是0

在这里插入图片描述

两个指针dest cur 将数组划分为三部分

在这里插入图片描述

两指针作用:

cur:从左向右扫描数组,遍历数组,cur左边就是处理过的,右边就是未处理的

dest:已处理的区间内,最后一个非0的位置

从而可以分为三个区间

在这里插入图片描述

当cur到n时,最后一个区间不见了,只剩下前两个区间,并且前边是非0,后边是0

cur指向第一个元素。dest因为还没有确定最后一个非0元素的位置,所以先指向-1

cur移动时会遇见两种情况

1.遇到0时,cur++,从而保证[dest+1,cur-1]这个区间是0

代码就是cur++

2.遇到非0时,要让这个 值加入到第一个区间,也就是[0.dest]这个区间,所以要dest移动到下一个位置从而扩大这个区间,并且dest移动到0,再交换此时dest和cur的位置

代码就是

swap(dest+1,cur)

dest++,cur++

3.代码实现

classSolution{public:voidmoveZeroes(vector<int>& nums){for(int dest=-1,cur=0;cur<nums.size();cur++){//cur每轮都++,所以不用单独写cur遇到0的情况if(nums[cur])//遇到非0元素时swap(nums[++dest],nums[cur]);}}};

二.复写零

[题目传送门](1089. 复写零 - 力扣(LeetCode))

1.题目描述

在这里插入图片描述

2.算法原理

双指针法,先根据“异地”操作,然后优化到“就地”操作

问题难点:直接在原数组上操作会覆盖后续元素

解决方案:分两步操作

第一步:定位最后一个需要复写的元素

使用双指针模拟复写过程:

  • cur:遍历原数组
  • dest:跟踪在新数组中的位置

特殊规则

  • 遇到非零元素:dest移动1位
  • 遇到零元素:dest移动2位(因为零需要被复写)

dest达到或超过数组末尾时,停止遍历,此时的cur就是最后一个需要复写的元素。

在这里插入图片描述
第二步:从后向前复写

cur位置开始向前遍历:

  • 遇到非零元素:直接复制到dest位置
  • 遇到零元素:在dest位置写入两个零

边界情况处理
如果最后一个零恰好使dest超出数组边界,需要特殊处理:

  1. 在数组末尾写入一个零
  2. curdest指针相应调整

3.代码实现

classSolution{public:voidduplicateZeros(vector<int>& arr){int cur=0,dest=-1,n=arr.size();//1.找最后一个数while(cur<n){if(arr[cur]) dest++;else dest+=2;if(dest>=n-1)break; cur++;}//2.处理边界情况if(dest==n){ arr[n-1]=0; cur--,dest-=2;}//3.复写while(cur>=0){if(arr[cur]) arr[dest--]=arr[cur--];else{ arr[dest--]=0; arr[dest--]=0; cur--;}}}};

Read more

【Docker进阶篇】告别OOM Kill!Java容器化内存与CPU限制实战指南

【Docker进阶篇】告别OOM Kill!Java容器化内存与CPU限制实战指南

🍃 予枫:个人主页 📚 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 💻 Debug 这个世界,Return 更好的自己! 引言 做Java容器化部署的小伙伴,大概率都踩过这样的坑:明明给容器配置了–memory限制,JVM也设了-Xmx参数,结果应用还是频繁被OOM Kill;要么就是CPU限制设太高,资源浪费严重,设太低又导致应用卡顿。今天就彻底搞懂Java容器化中CPU和内存限制的核心逻辑,避开配置陷阱,让应用稳定运行不翻车! 文章目录 * 引言 * 一、为什么Java容器化,内存和CPU配置容易出问题? * 二、容器内存限制(--memory)配置指南(重点避坑) * 2.1 容器内存的组成的部分 * 2.2 内存配置黄金比例(实战可用) * 实战示例(重点) * 2.3 关键避坑点(必看) * 三、容器CPU限制(--cpus)

By Ne0inhk
Flutter 三方库 openapi_dart_common 的鸿蒙化适配指南 - 实现具备强类型契约的高性能 API 通讯模型、支持端侧 OpenAPI/Swagger 协议的自动化生成与对齐实战

Flutter 三方库 openapi_dart_common 的鸿蒙化适配指南 - 实现具备强类型契约的高性能 API 通讯模型、支持端侧 OpenAPI/Swagger 协议的自动化生成与对齐实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 openapi_dart_common 的鸿蒙化适配指南 - 实现具备强类型契约的高性能 API 通讯模型、支持端侧 OpenAPI/Swagger 协议的自动化生成与对齐实战 前言 在进行 Flutter for OpenHarmony 的企业级前后端分离开发时,如何保证客户端请求代码与后端 API 定义的绝对同步?手动编写 API 模型不仅低效,且极易引发类型不匹配导致的生产 Bug。openapi_dart_common 是 OpenAPI (Swagger) 官方生成器在 Dart 端的基石库。它提供了一套标准的序列化、参数处理及抽象拦截器机制。本文将探讨如何在鸿蒙端构建极致稳健的工程化接口层。 一、原直观解析 / 概念介绍 1.1

By Ne0inhk
Flutter 三方库 mobx_codegen — 自动化驱动的高性能响应式状态管理(适配鸿蒙 HarmonyOS Next ohos)

Flutter 三方库 mobx_codegen — 自动化驱动的高性能响应式状态管理(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 在 Flutter 状态管理的璀璨星空中,MobX 以其“透明的函数式响应式编程”(TFRP)特性脱颖而出。它让开发者能以声明式的方式描述状态,而让框架自动处理状态变更到 UI 刷新的全过程。 在 Flutter for OpenHarmony 开发中,手动编写 MobX 繁琐的连接代码不仅效率低,且容易出错。mobx_codegen 库通过解析注解,自动生成高性能的底层观察逻辑。今天,我们将探索如何利用自动化力量,在鸿蒙平台上构建出极其灵动的响应式应用。 一、为什么需要 mobx_codegen? 1.1 MobX 的魔法核心 MobX 包含三个核心概念:Observables(被观察的状态)、Actions(改变状态的动作)和 Reactions(对新状态的自动响应)

By Ne0inhk

服务器HBA卡与RAID卡:到底有什么区别?

1.本质定义与功能定位 1.1 HBA卡(主机总线适配器) 定义:HBA(Host Bus Adapter)是连接服务器内部I/O通道与外部存储设备的硬件接口卡,主要承担协议转换和物理连接功能。 核心功能: * 提供高速数据传输通道 * 实现协议转换(如SCSI、SAS、SATA、FC等) * 将存储设备透明呈现给操作系统 * 支持直接设备访问,无中间处理层 1.2 RAID卡(磁盘阵列控制器) 定义:RAID(Redundant Array of Independent Disks)卡是专门管理多个硬盘组成磁盘阵列的硬件控制器,具备数据冗余和性能优化功能。 核心功能: * 实现RAID级别配置(RAID 0/1/5/6/10等) * 提供数据冗余保护与容错机制 * 优化磁盘读写性能(条带化、缓存等) * 支持热插拔与故障磁盘替换

By Ne0inhk