补充二:双指针

双指针

    • 快慢指针
    • 对撞指针
    • 滑动窗口

双指针指的是用两个不同指向的浮标,在一个for循环中完成两个for循环的操作

快慢指针

由于数组的地址是连续的,所以无法像链表一样删除指定的某一项,因此在数组中,删除操作都是由覆盖来实现。

若给你⼀个数组 n u m s nums nums 和⼀个值 v a l val val,你需要原地移除所有数值等于 v a l val val 的元素,并且不要改变其他元素的相对位置,不要使⽤额外的数组空间,你必须原地修改输⼊的数组。
例如: n u m s = [ 1 , 2 , 3 , 4 , 3 , 5 , 6 ] , v a l = 3 nums = [1, 2, 3, 4, 3, 5, 6], val = 3 nums=[1,2,3,4,3,5,6],val=3,删除后数组的长度变为 5 5 5 则应该将原数组的前 5 5 5 项变为 n u m s = [ 1 , 2 , 4 , 5 , 6 ] nums = [1, 2, 4, 5, 6] nums=[1,2,4,5,6] 即可,第五个元素之后的东西是什么我们并不关心,即:如果你的 n u m s nums nums 数组为: [ 1 , 2 , 4 , 5 , 6 , X , X , X , X . . . . ] [1,2,4,5,6,X,X,X,X....] [1,2,4,5,6,X,X,X,X....],我们不关心第五项后的 X X X是什么。

如果是暴力解题,即遇到指定的 v a l val val 则将后续元素依次迁移一位,则运行复杂度为 O ( n 2 ) O(n^2) O(n2)

void DeleteVal(vector<int>&vec, int val){int len = vec.size();for(int i = 0; i < len; i++) {if (vec[i] != val)continue;for (int j = i + 1; j < len; j++) {vec[j - 1] = vec[j];}i--;    //覆盖了第i项,所以要重新对第i项进行检查len--;  //有效长度减一}
}

现在,我们假设有一个处理之后的数组是一个新数组,试想有两个浮标 L L L R R R R R R 指向当前要判断的原数组的元素的位置, L L L 指向该元素要放在新数组的哪个位置。如果 n u m s [ R ] nums[R] nums[R]不是指定元素 v a l val val,则将 n u m s [ R ] 放在 n u m s [ L ] 处 nums[R] 放在 nums[L]处 nums[R]放在nums[L],便得到了以下代码

void DeleteVal(vector<int>&nums, int val){int len = nums.size();int L = 0, R = 0;for(R = 0; R < len; R++){if(nums[R] != val){nums[L] = nums[R];L++;}}
}

对撞指针

与上个情况相同,如果不考虑保持相对位置不变的话,我们可以试着将 R R R 指向数组尾部, L L L 指向数组头部,我们从左往右找到第一个 v a l val val 的位置和最后一个不是 v a l val val 的位置,然后交换这两个位置的值。一直重复这个操作,直到 L L L R R R 相遇。

void DeleteVal(vector<int>& nums, int val) {int L = 0;int R = nums.size() - 1;while (L <= R) {while (L <= R && nums[L] != val){L++; //寻找第一个等于val的值}while (L <= R && nums[R] == val) {R--; //寻找最后一个不是val的值}if (L < R) {// L < R 时才能交换nums[L] = nums[R];L--; R++;}}
}

若给你一个升序数组 n u m s nums nums,要你返回一个包含 n u m s nums nums 数组中所有元素平方的非递减有序数组,例如: n u m s = [ − 4 , − 2 , − 1 , 1 , 2 , 3 , 4 ] nums = [-4,-2,-1,1,2,3,4] nums=[4,2,1,1,2,3,4],你需要返回 a n s = [ 1 , 1 , 4 , 4 , 9 , 16 , 16 ] ans = [1,1,4,4,9,16,16] ans=[1,1,4,4,9,16,16]

因为有负数的存在,所以我们会发现平方之后的数有可能中间小两边大,因此可以设置两个指针 L L L R R R L L L 指向 n u m s nums nums 的开头 R R R 指向结尾,每次比较 n u m s [ L ] 2 nums[L]^2 nums[L]2 n u m s [ R ] 2 nums[R]^2 nums[R]2 的大小,然后从后往前放入新数组里,直到 L L L R R R 相遇时结束这个过程。

int* DeleteVal(vector<int> nums) {int L = 0, R = nums.size() - 1;int *ans = new int[R + 1], nowIndex = R;while (L <= R) {if(abs(nums[R]) >= abs(nums[L])){ans[nowIndex--] = nums[R] * nums[R];R--;}else{ans[nowIndex--] = nums[L] * nums[L];L++;}}return ans;
}

滑动窗口

滑动窗⼝,就是不断的调节⼦序列的起始位置和终⽌位置,从⽽得出我们要想的结果。
在暴⼒解法中,是⼀个 f o r for for循环滑动窗⼝的起始位置,⼀个 f o r for for循环为滑动窗⼝的终⽌位置,⽤两个 f o r for for循环完成了⼀个不断搜索区间的过程。

那么如何⽤⼀个 f o r for for循环来完成这个操作呢?
⾸先要思考 如果⽤⼀个 f o r for for循环,那么应该表示滑动窗⼝的起始位置,还是终⽌位置呢?
如果只⽤⼀个 f o r for for循环来表示滑动窗⼝的起始位置,那么如何遍历剩下的终⽌位置?
所以 只⽤⼀个 f o r for for循环,那么这个循环的索引,⼀定是表示滑动窗⼝的终⽌位置。

那么滑动窗⼝的起始位置如何移动呢?

例如:给定⼀个含有 n n n 个正整数的数组 n u m s nums nums 和⼀个正整数 s s s ,找出该数组中满⾜其和 ≥ s ≥ s s 的⻓度最⼩的连续⼦数组,并返回其⻓度。如果不存在符合条件的⼦数组,返回 0。
s = 7 s=7 s=7 n u m s = [ 2 , 3 , 1 , 2 , 4 , 3 ] nums = [2,3,1,2,4,3] nums=[231243],我们会发现,最短的符合的子数组长度为 2 , 子数组为 [ 4 , 3 ] 2,子数组为[4,3] 2,子数组为[4,3]
在实现滑动窗⼝时主要确定如下三点:

  1. 窗⼝内是什么?
  2. 如何移动窗⼝的起始位置?
  3. 如何移动窗⼝的结束位置?

窗⼝内是满⾜其和 ≥ s ≥ s s 的⻓度最⼩的连续⼦数组。
窗⼝的起始位置如何移动:如果当前窗⼝的值⼤于 s s s了,窗⼝就要向前移动了(也就是该缩⼩了)。
窗⼝的结束位置如何移动:窗⼝的结束位置就是遍历数组的指针,也就是 f o r for for循环⾥的索引

int DeleteVal(vector<int> nums, int s) {int L = 0;int sum = 0, ans = INT_MAX;int subLength;for(int R = 0; R < nums.size(); R++) {sum += nums[R];/***    核心段       ***/while (sum >= s) {subLength = (R - L + 1);ans = min(ans, subLength);sum -= nums[L++];}/**********************/}return ans == INT_MAX ? 0 : ans;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数字化转型企业架构设计手册(交付版),企业数字化转型建设思路、本质、数字化架构、数字化规划蓝图(PPT原件获取)

1、企业架构现状分析 2、企业架构内容框架 3、企业架构设计方法 3.1 、业务架构设计方法 3.2 、数据架构设计方法 3.3 、应用架构设计方法 3.4 、技术架构设计方法 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

鸿蒙NEXT自定义组件:太极Loading

【引言】&#xff08;完整代码在最后面&#xff09; 本文将介绍如何在鸿蒙NEXT中创建一个自定义的“太极Loading”组件&#xff0c;为你的应用增添独特的视觉效果。 【环境准备】 电脑系统&#xff1a;windows 10 开发工具&#xff1a;DevEco Studio NEXT Beta1 Build Vers…

AVL树了解并简单实现

这篇文章默认知道二叉搜索树&#xff0c;如果了解并不多可以先看看二叉搜索树了解和实现-CSDN博客 目录 1.AVL树概念 2.AVL树节点定义 3.AVL树的插入&#xff08;重点&#xff09; 3.1AVL树 3.2AVL树的旋转 3.3AVL树插入代码 4.AVL树的验证 5.AVL树的删除 6.AVL树的性能…

【MySQL】索引原理及操作

目录 索引原理 初识索引 磁盘原理 磁盘与系统之间的关系 MySQL、系统、磁盘之间的关系 理解索引 页目录 页目录设计的数据结构问题 聚簇索引与非聚簇索引 遗留问题 索引操作 创建索引 查询索引 删除索引 其他索引概念与操作 索引原理 索引&#xff08;I…

代码随想录算法训练营第三十一天| 56. 合并区间 、738.单调递增的数字 。c++转java

56. 合并区间 class Solution {public int[][] merge(int[][] intervals) {//对区间按照右边界排序Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));List<int[]> p new LinkedList<>();int l intervals[0][0],r intervals[0][1];for(int i 1;i…

厦大南洋理工最新开源,一种面向户外场景的特征-几何一致性无监督点云配准方法

导读 本文提出了INTEGER&#xff0c;一种面向户外点云数据的无监督配准方法&#xff0c;通过整合高层上下文和低层几何特征信息来生成更可靠的伪标签。该方法基于教师-学生框架&#xff0c;创新性地引入特征-几何一致性挖掘&#xff08;FGCM&#xff09;模块以提高伪标签的准确…

模型运行速度笔记: s/epoch VS s/iter

1 概念介绍 在模型训练中&#xff1a; s/epoch 表示每个epoch所需的秒数&#xff0c;即完成一轮完整数据集训练的时间。s/iter 表示每个iteration&#xff08;迭代&#xff09;所需的秒数&#xff0c;即处理一个batch的时间。 它们的关系是&#xff1a; 2 举例 比如我tra…

k8s 中传递参数给docker容器

文章目录 docker启动时传递参数使用k8s env传递完全覆盖 ENTRYPOINT 和 CMD 在 Kubernetes 中&#xff0c;可以通过多种方式将参数传递给 Dockerfile 或其运行的容器&#xff0c;常见的方式包括使用环境变量、命令行参数、配置文件等。以下是一些常用的方法&#xff1a; docker…

Map Set

在学习TreeMap和TreeSet之前需要先学习有关搜索树的相关知识以及接口Map和Set。 1. 搜索树 1.1 概念 二叉搜索树又称二叉排序树&#xff0c;其特点是&#xff0c;该节点的左边都比其小&#xff0c;右边都比其大&#xff0c;每一棵子树都必须满足这个条件。如下图所示例子。2…

Android OpenGLES2.0开发(八):Camera预览

严以律己&#xff0c;宽以待人 引言 终于到该章节了&#xff0c;还记得Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始章节说的吗&#xff1f;写这个系列的初衷就是因为每次用到GLSurfaceViewCamera预览时&#xff0c;总是CtrlC、CtrlV从来没有研究…

基础 IO

目录 一、基本共识 二、复习C语言中的文件操作 三、与文件操作有关的系统调用接口 1. open 与 close 1.1 umask 2. write 3. read 四、如何理解文件 1. 文件描述符 fd 2. 文件fd分配规则 3. 重定向的引入 4. 重定向的本质 5. dup2 6. 理解 >、>>、…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

[含文档+PPT+源码等]精品基于springboot实现的原生Andriod手机使用管理软件

软件开发环境及开发工具&#xff1a; 数据库管理工具&#xff1a;phpstudy/Navicat或者phpstudy/sqlyog 开发工具&#xff1a;Android Studio 后台管理系统涉及技术&#xff1a; 后台使用框架&#xff1a;Springboot 前端使用技术&#xff1a;Vue,HTML5,CSS3、JavaScript等…

华为三层交换机禁止VLAN间通讯(两种解决方案)

在日常办公中&#xff0c;有时会禁止内网中各个部门间的访问&#xff0c;例如&#xff1a; ①访客不能访问内网任何终端及服务器 ②财务部门不能被其他部门访问 实验环境&#xff1a;华为Ensp模拟器 内网架构&#xff1a;三层网络 环境说明&#xff1a;三层交换机承载着网…

为以人工智能为中心的工作负载重新设计的全局控制台

MinIO 控制台多年来一直是一个不断发展的产品。每次学习时&#xff0c;我们都会思考如何改进交互框架中这个非常重要的部分。首先是控制台&#xff0c;它在推出后的一年内就被广泛采用。更具体地说&#xff0c;超过 10K 个组织。接下来是企业控制台。这从对象存储与其 GUI 之间…

stm32在linux环境下的开发与调试

环境安装 注&#xff1a;文末提供一键脚本 下载安装stm32cubeclt 下载地址为&#xff1a;https://www.st.com/en/development-tools/stm32cubeclt.html 选择 linux版本下载安装 安装好后默认在家目录st下 > $ ls ~/st/stm32cubeclt_1.16.0 …

【leetcode】N皇后 回溯法c++

目录 51.N皇后 52.N皇后II 51.N皇后 51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间…

GESP4级考试语法知识(贪心算法(六))

寻找平面上的极大点代码 #include<iostream> #include<algorithm> using namespace std; struct node {int x,y; }a[101]; bool vis[101]; bool cmp(node A,node B) {if(A.x!B.x) return A.x<B.x;return A.y<B.y; } int main() {int n;cin>>n;for(int…

如何构建高效的知识库系统?实现智能信息管理

在当今信息化迅速发展的时代&#xff0c;企业和组织面临着海量信息的挑战。如何有效地管理这些信息&#xff0c;使其安全、易于访问&#xff0c;并且能够快速响应用户的需求&#xff0c;成为了智慧管理的核心。而知识库系统(Knowledge Base System)正是为了解决这一问题而应运而…