【算法】双指针(一)-移动零

【算法】双指针(一)-移动零

目录

一、题目介绍

二、双指针原理

1.当前维护指针

1.1维护方向

(1)条件边界

三、三指针原理

应用

1.快速排序

2.快速选择找元素

2.1找第k大元素

2.2找等于k元素

四、提交代码


一、题目介绍

283. 移动零 - 力扣(LeetCode)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0]

示例 2:

输入: nums = [0] 输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

二、双指针原理

扩容遍历指针当前维护指针从小维护到大1.当前维护指针1.1维护方向(1)条件边界

根据条件判搬新值 维护一个条件边界
一个动作区间 蓄意的始到末 截出后 开始重复
三、三指针原理

多一个指针 维护 另一侧来的是非判断两性质块中间第三块 就是 两剩性质的第三块中间第三块只能分好两剩的性质

75. 颜色分类 - 力扣(LeetCode)

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]

示例 2:输入:nums = [2,0,1] 输出:[0,1,2]

提示:n == nums.length1 <= n <= 300nums[i] 为 01 或 2应用

能实现 排块的基准排序

左块性质<基准元素中间第三块性质=基准元素右块性质>基准元素

无序的左小块
  排好的块等元素  无序的右大块1.快速排序

排好 块等元素 —> 快速排序

912. 排序数组 - 力扣(LeetCode)

排好 块等元素 —> 快速排序

给你一个整数数组 nums,请你将该数组升序排列。

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

示例 1:输入:nums = [5,2,3,1] 输出:[1,2,3,5] 解释:数组排序后,某些数字的位置没有改变(例如,2 和 3),而其他数字的位置发生了改变(例如,1 和 5)。

示例 2:输入:nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 解释:请注意,nums 的值不一定唯一。

提示:1 <= nums.length <= 5 * 104-5 * 104 <= nums[i] <= 5 * 1042.快速选择找元素

排好 无序左小块块等元素无序右大块 —> 快速选择找元素全排好下 去找 至少有排序N*logN只排 三块式基准 下 去找 N2.1找第k大元素

215. 数组中的第K个最大元素 - 力扣(LeetCode)

 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:输入: [3,2,1,5,6,4], k = 2 输出: 5

示例 2:输入: [3,2,3,1,2,4,5,5,6], k = 4 输出: 4

提示:1 <= k <= nums.length <= 105-104 <= nums[i] <= 1042.2找前k小元素

LCR 159. 库存管理 III - 力扣(LeetCode)

仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限

示例 1:输入:stock = [2,5,7,4], cnt = 1 输出:[2]

示例 2:输入:stock = [0,2,3,6], cnt = 2 输出:[0,2] 或 [2,0]

提示:0 <= cnt <= stock.length <= 10000
0 <= stock[i] <= 10000

四、提交代码

public void moveZeroes(int[] nums) { int cur = 0; int dest = -1; // 维护 当前最后一个非0的 边界 while(cur < nums.length) { if(nums[cur] != 0) { int tmp; tmp = nums[++dest];//除最开始时外,就是0的 nums[dest] = nums[cur]; nums[cur] = tmp; // 左边搬过来的 cur已经扫描过的,不用再扫描++ } cur++; } }

Read more

Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构

Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构 前言 在鸿蒙(OpenHarmony)生态迈向多任务并行、长周期驻留及高频账户流转的全场景办公与生活背景下,如何确保应用在退出登录、环境切换或异常恢复时能够“不留痕迹”地销毁脏数据,已成为衡量应用健壮性的核心指标。在鸿蒙设备这类强调分布式沙箱隔离与严苛内存占用(Resident Set Size)管控的环境下,如果应用缺乏统一的资源清理机制,由于由于散落在各处的 Stream 监听、本地缓存及内存单例,极易由于由于状态残留导致不同用户间的数据越权或 UI 状态的逻辑死锁。 我们需要一种能够集中注册清理任务、支持并发异步销毁且具备原子性执行保障的状态复位框架。 cleany 为 Flutter 开发者引入了极其暴力且高效的“全域清算”范式。它通过中心化的管理器(Manager),允许各个业务模块在初始化时注册其对应的资源回收钩子。在适

By Ne0inhk
【Linux】Linux 开发必备:信号处理时机 + 中断向量表 + 系统调用表,内核态切换核心知识点

【Linux】Linux 开发必备:信号处理时机 + 中断向量表 + 系统调用表,内核态切换核心知识点

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!! IF’Maxue:个人主页  🔥 个人专栏: 《C语言》 《C++深度学习》 《Linux》 《数据结构》 《数学建模》 ⛺️生活是默默的坚持,毅力是永久的享受。不破不立! 文章目录 * Linux信号处理时机与内核态/用户态深度解析 * 一、信号处理的“合适时机”是什么? * 合适的实际? * 结合课件 * 1.1 信号处理的触发时机 * 1.2 信号检查与处理流程 * 1.3 不同处理动作的差异 * 1.4 自定义捕捉的身份切换细节 * 二、硬件中断:OS运行的“驱动力” * 2.1 硬件中断的基本原理 * 2.

By Ne0inhk
Flutter 三方库 df_generate_dart_models_core 的鸿蒙化适配指南 - 实现自动化的数据模型代码生成、支持 JSON 反序列化模板定义与工程化规范一致性

Flutter 三方库 df_generate_dart_models_core 的鸿蒙化适配指南 - 实现自动化的数据模型代码生成、支持 JSON 反序列化模板定义与工程化规范一致性

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 df_generate_dart_models_core 的鸿蒙化适配指南 - 实现自动化的数据模型代码生成、支持 JSON 反序列化模板定义与工程化规范一致性 前言 在进行 Flutter for OpenHarmony 的大规模业务逻辑开发时,手动编写海量的 Data Models(POJO/Entity)以及配套的 fromJson/toJson 方法不仅枯燥乏味,还极易引入手写错误。df_generate_dart_models_core 是一个强大的代码生成核心库,它能将原始 JSON 样本或 Schema 自动转化为符合 Dart 规范的数据类代码。本文将指导大家如何将该库集成到鸿蒙项目的工程化提效链路中。 一、原理解析

By Ne0inhk
Flutter 三方库 username_gen 的鸿蒙化适配指南 - 实现具备语义化特征的随机用户名自动化生成、支持端侧快速原型开发与测试数据模拟实战

Flutter 三方库 username_gen 的鸿蒙化适配指南 - 实现具备语义化特征的随机用户名自动化生成、支持端侧快速原型开发与测试数据模拟实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 username_gen 的鸿蒙化适配指南 - 实现具备语义化特征的随机用户名自动化生成、支持端侧快速原型开发与测试数据模拟实战 前言 在进行 Flutter for OpenHarmony 的社交原型开发、内部压力测试或注册流程的兜底模拟时,如何快速产生大量、易读且不重复的用户名?手动硬编码 "test_user_1" 显然过于僵硬且不具备真实感。username_gen 是一款专注于基于形容词与名词组合建立“有趣”用户名的轻量级库。本文将探讨如何在鸿蒙端构建极致、敏捷的模拟数据填充体系。 一、原直观解析 / 概念介绍 1.1 基础原理 该库内置了一套精选的英文形容词库与名词库。通过洗牌算法(Shuffle)与自定义后缀注入逻辑,能在毫秒级产出符合 "AdjectiveNPC"

By Ne0inhk