刷刷刷——双指针算法

在这里插入图片描述

双指针算法

这里的双指针,可能并不是真正意义上的指针,而是模拟指针移动的过程。

常见的有两种:

双指针对撞:

  • 即在顺序结构中,指针从两端向中间移动,然后逐渐逼近

  • 终止条件一般是:

    left == right 指向同一个位置

    or left>right指针错开

快慢指针:

  • 该方法一般用于处理环形链表或者是数组

283. 移动零

算法原理

这里有两种方法:

  • 方法1: 开辟一个新的空间,如果不是0,而增添到新的空间,最后在补齐0即可

  • 方法2:采用前后指针,cur遍历数组,prev指向最后一个非0元素(我们采用该解法)

    image-20230912225033669

代码实现

class Solution {
public:void moveZeroes(vector<int>& nums){int prev = -1;for(int cur=0; cur<nums.size();cur++){if(nums[cur] != 0){swap(nums[++prev],nums[cur]);}}}
};

1089. 复写零

算法原理

2种方法:

  • 方法1:开辟一个容量与参数一样的新的空间,遇到0就写2次,直到空间与满为止

  • 方法2:找到最后一个复写的数(判断cur的值,决定dest是走一步还是走两步)然后再从后往前遍历(从前往后遍历会导致后面的数被修改),完成复写操作

    这里要注意处理边界情况

    image-20230912230553216

代码实现

“异地操作”

class Solution {
public:void duplicateZeros(vector<int>& arr) {vector<int> tmp;tmp.resize(arr.size());int cur = 0;int prev = 0;while(cur<arr.size()){if(prev<arr.size() && arr[cur] == 0){tmp[prev++] = arr[cur];}if(prev<arr.size()){tmp[prev++] = arr[cur];}elsebreak;++cur;}arr = tmp;}
};

“本地操作”

class Solution
{
public:
void duplicateZeros(vector<int>& arr) 
{int cur = 0;int dest = -1;//找最后一个复写的数while (cur < arr.size()){if (arr[cur] == 0){dest += 2;}else{dest++;}if(dest >= arr.size() - 1){//边界处理if(dest == arr.size()){arr[arr.size() - 1] = 0;cur--;dest -= 2;}break;}cur++;}//从后往前while (cur >= 0){if (arr[cur] == 0)arr [dest--] = arr[cur];arr [dest--] = arr[cur];cur--;}
}
};

202. 快乐数

算法原理

这题可以理解为类似链表带环问题,采用“快慢指针”的方法来解决

这里的“快慢指针”是计算数据的跨度,一个每次计算平方,一个每次计算平方的平方(题目已经告诉我们,要么变成1,要么无限循环,当它循环相遇的时候不是1,那么就肯定不是快乐数)

鸽巢原理:

n个巢穴,有n+1个鸽子,那么至少有一个巢穴里面的鸽子数量大于1

int的最大值为例:

image-20230912233931164

代码实现

class Solution
{
public:int fastQSum(int n)
{int tmp = 0;int sum = 0;while(n){tmp = pow((n%10),2)+tmp;n=n/10; }while(tmp){sum = pow((tmp%10),2)+sum;tmp = tmp/10;}return sum;
}
int slowQSum(int n)
{int sum = 0;while(n){sum = pow((n%10),2)+sum;n=n/10; }return sum;
}bool isHappy(int n){int slow = slowQSum(n);int fast = fastQSum(n);while(1){if(fast == 1 || slow == 1)return true;else if(slow == fast && slow!=1)return false;slow = slowQSum(slow);fast = fastQSum(fast);}}
};

11. 盛最多水的容器

算法原理

这里可以采用暴力枚举的方法,将全部的容积算出来,但这里太暴力的,而且可能会超时

所以利用单调性,采用双指针的方法:

image-20230913000411924

代码实现

class Solution {
public:int maxArea(vector<int>& height) {int left = 0;int right = height.size()-1;int Max = 0;while(left<right){int h = min(height[left],height[right]);int w = right-left;int v = h*w;if(v>Max){Max = v;}if(height[left]<height[right])left++;elseright--;}return Max;}
};

611. 有效三角形的个数

算法原理

三角形判断:2个较小数大于最大数,只需判断一次

这题也可以采用暴力枚举的方法,如果将这个暴力解法采用双指针优化一下,就可以降低一个量级的复杂度

  1. 先排序
  2. 固定最大数
  3. 在最大数的左区间,找出符合的元素

image-20230913001340952

代码实现

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());int m = nums.size()-1;int ret = 0;while(m>=2){int Max = nums[m];int left = 0;int right = m-1;while(left<right){int sum = nums[left]+nums[right];if(sum>Max){ret += (right-left);right--;}else{left++;}}m--;}return ret;}
};

剑指 Offer 57. 和为s的两个数字

这题较简单,直接看代码:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target){int left = 0;int right = nums.size()-1;while(left<right){int sum = nums[left]+nums[right];if(sum == target){break;}else if(sum>target){right--;}else if(sum<target){left++;}}return {nums[left],nums[right]};}
};

15. 三数之和

算法原理

这里最暴力的方法就是先将元素排序,然后在暴力枚举,将结果放入set去重,但这个只能在比赛或者考试的时候勉强通过,实际还是不建议这样解;

我们还是采用双指针的方法:

  1. 先将数组排序
  2. 然后固定一个数(最左、最右都可以)
  3. 该数的后面/前面区间,找到和为-sum的数即可

细节:

去重操作,找到结果之后,双指针跳过重复的元素;固定值也要跳过重复的元素

代码实现

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//先排序sort(nums.begin(),nums.end());vector<vector<int>> ret;int n = nums.size();int iMin = 0;while(iMin<n){if(nums[iMin]>0)break;int left =  iMin+1;int right = n-1;while(left<right){int sum = nums[left]+nums[right];int target = -nums[iMin];if(sum == target){ret.push_back({nums[iMin],nums[left],nums[right]});left++;right--;//去重while(left<right && nums[left] ==nums[left-1])left++;while(left<right && nums[right] ==nums[right+1])right--;}else if(sum>target)right--;else if(sum<target)left++;}iMin++;//去重while(iMin<n && nums[iMin]== nums[iMin-1])iMin++;}return ret;}
};

18. 四数之和

原理和三数之和一样,但这里要多一次去重操作;另外,这里的测试用例有溢出值,所以部分位置采用long long类型

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target){vector<vector<int>> ret;sort(nums.begin(),nums.end());int n = nums.size();int iMin = 0;while(iMin<n){//固定值int left = iMin+1;int right = n-1;while(left<right){int t = target-nums[iMin];int _left = left+1;int _right = right;while(_left<_right){int sum = nums[_left]+nums[_right];long long _t = (long long)t-nums[left];if(sum == _t){ret.push_back({nums[iMin],nums[left],nums[_left],nums[_right]});_left++;_right--;while(_left<_right && nums[_left] == nums[_left-1])_left++;while(_left<_right && nums[_right] == nums[_right+1])_right--;}else if(sum<_t)_left++;else if(sum>_t)_right--;}left++;while(left<right && nums[left] == nums[left-1])left++;}   iMin++;while(iMin<n && nums[iMin] == nums[iMin-1])iMin++;}return ret;}
};
}else if(sum<_t)_left++;else if(sum>_t)_right--;}left++;while(left<right && nums[left] == nums[left-1])left++;}   iMin++;while(iMin<n && nums[iMin] == nums[iMin-1])iMin++;}return ret;
}

};


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

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

相关文章

Java面试笔试acm版输入

首先区分scanner.nextInt()//输入一个整数&#xff0c;只能读取一个数&#xff0c;空格就停止。 scanner.next()//输入字符串&#xff0c;只能读取一个字符串&#xff0c;空格就停止&#xff0c;但是逗号不停止。 scanner.nextLine() 读取一行&#xff0c;换行停止&#xff0c…

Excel、Jira、Bugfree 应该选哪个做bug管理?深度对比

如何选择最适合您团队的Bug管理系统&#xff1f;本指南提供了全面的选型建议&#xff0c;并深度对比了7类主流工具如PingCode、Jira、 Mantis等&#xff0c;涵盖功能、成本、易用性等多个关键因素。适用于软件开发团队、项目经理和决策者。 一、适合的BUG管理工具在产品开发中的…

Web Component -- 即将爆发的原生的 UI 组件化标准

Web Component 概述 Web Component 是一种用于构建可复用用户界面组件的技术&#xff0c;开发者可以创建自定义的 HTML 标签&#xff0c;并将其封装为包含逻辑和样式的独立组件&#xff0c;从而在任何 Web 应用中重复使用。 每个 Web Component 都具有自己的 DOM 和样式隔离&a…

2023-09-12 LeetCode每日一题(课程表 IV)

2023-03-29每日一题 一、题目编号 1462. 课程表 IV二、题目链接 点击跳转到题目位置 三、题目描述 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你…

华为CD32键盘使用教程

华为CD32键盘使用教程 用爱发电写的教程&#xff01; 最后更新时间&#xff1a;2023.9.12 型号&#xff1a;华为有线键盘CD32 基本使用 此键盘在不安装驱动的情况下可以直接使用&#xff0c;但是不安装驱动指纹识别是无法使用的&#xff01;并且NFC功能只支持华为的部分电脑…

科技资讯|苹果虚拟纸可在Vision Pro中为广告、书籍等提供MR内容和动画

近日&#xff0c;美国专利商标局正式授予苹果一项与虚拟纸张相关的专利。这是与虚拟纸张这项发明相关的第二项专利&#xff0c;鉴于苹果 Vision Pro 将于明年上市&#xff0c;那么我们离苹果实现虚拟纸张的发明又近了一步。 虚拟纸张将能够包含 2D、3D 和动画等 MR内容&#…

JavaScript中循环遍历数组、跳出循环和继续循环

循环遍历数组 上个文章我们简单的介绍for循环&#xff0c;接下来&#xff0c;我们使用for循环去读取数据的数据&#xff0c;之前我们写过这样的一个数组&#xff0c;如下&#xff1a; const ITshareArray ["张三","二愣子","2033-1997","…

基于Elasticsearch的多文档检索 比如 商品(goods)、案例(cases)

概述 Elasticsearch多文档聚合检索 详细 记得把这几点描述好咯&#xff1a;需求&#xff08;要做什么&#xff09; 代码实现过程 项目文件结构截图 演示效果 应用场景 我们需要在五种不同的文档中检索数据。 比如 商品&#xff08;goods&#xff09;、案例&#xff08;ca…

(2)数据库mongodb 终端 和 vscode创建数据库 数据导入导出

可视化工具&#xff1a; Robo 3T | Free, open-source MongoDB GUI (formerly Robomongo) mongodb安装官网&#xff1a;MongoDB: The Developer Data Platform | MongoDB 文档&#xff1a;安装 MongoDB - MongoDB-CN-Manual (mongoing.com) 配置环境变量&#xff1a; 是为了扩…

微信小程序音频后台播放功能

微信小程序在手机息屏后依旧能播放音频&#xff0c;需要使用 wx.getBackgroundAudioManager() 方法创建后台音乐播放器&#xff0c;并将音乐播放任务交给这个后台播放器。 具体实现步骤如下&#xff1a; 小程序页面中&#xff0c;使用 wx.getBackgroundAudioManager() 方法创…

pandas 筛选数据的 8 个骚操作

日常用Python做数据分析最常用到的就是查询筛选了&#xff0c;按各种条件、各种维度以及组合挑出我们想要的数据&#xff0c;以方便我们分析挖掘。 东哥总结了日常查询和筛选常用的种骚操作&#xff0c;供各位学习参考。本文采用sklearn的boston数据举例介绍。 from sklearn …

jeesite实现excel导入功能(保姆级图文教程)

文章目录 前言一、准备工作1.准备一个excel模板,放入static目录2.application.yml文件中设置文件存储路径3.使用easyexcel插件解析excel数据,pom文件导入easyexcel二、使用步骤1.列表页添加下载模板按钮2.表单页添加文件上传3. 创建excel解析对应实体4.后台完成文件上传代码,…

SoC性能指标ARM内核运算能力

自动驾驶芯片常用的性能评价指标:TOPS,DMIPS,GFLOPS分别说的是啥&#xff1f; TOPS Tera Operation Per Second&#xff0c;表示每秒钟可以进行的操作数量&#xff0c;用于衡量自动驾驶的算力。 众所周知&#xff0c;汽车上最常用的传感器是摄像头&#xff0c;而与之对应的计…

springboot使用freemarker导出word

springboot使用freemarker导出word 一、需求说明二、制作模板文件1.修改word留下占位符并另存为.xml文件2.将xml文件后缀名改为.ftl3.打开ftl文件格式化内容4.将占位符替换成变量 三、代码实现1.引入依赖2.将模板引入resource下3.编写word导出工具包4.创建接口调用 一、需求说明…

Trinitycore学习之在Linux环境上搭建服务器并测试运行

1&#xff1a;准备环境&#xff0c;这里用ubuntu 22.04进行测试&#xff0c;安装环境后为了方便&#xff0c;换源。 注意&#xff1a;这里用的虚拟机&#xff0c;在虚拟机上生成地图信息&#xff0c;地图信息占用内存比较大&#xff0c;我暂时设置磁盘50G进行测试&#xff0c;…

iwebsec靶场 文件包含漏洞通关笔记4-远程文件包含

目录 前言 1.远程文件包含 2.远程文件条件 第03关 远程文件包含 1.打开靶场 2.源码分析 3.本地文件包含渗透 4.远程文件包含渗透 前言 1.远程文件包含 远程文件包含是文件包含漏洞的其中一种。这种漏洞在文件的URI位于其他服务器上并作为参数传递给PHP函数“include”…

【Linux】自制shell

本期我们利用之前学过的知识&#xff0c;写一个shell命令行程序 目录 一、初始代码 二、使用户输入的ls指令带有颜色分类 三、解决cd指令后用户所在路径不变化问题 3.1 chdir函数 四、关于环境变量的问题 一、初始代码 #include<stdio.h> #include<unistd.h…

LINUX 网络管理

目录 一、NetworkManager的特点 二、配置网络 1、使用ip命令临时配置 1&#xff09;查看网卡在网络层的配置信息 2&#xff09;查看网卡在数据链路层的配置信息 3&#xff09;添加或者删除临时的网卡 4&#xff09;禁用和启动指定网卡 2、修改配置文件 3、nmcli命令行…

软件安全研究(四)

文章目录 Fine-Grained Code Clone Detection with Block-Based Splitting of Abstract Syntax Tree文章结构IntroMotivationDefinitionSystemOverviewProcessingVerify Experimentexperimental settingsRQ1RQ2RQ3RQ4RQ5 Fine-Grained Code Clone Detection with Block-Based S…

78 # koa 中间件的实现

上上节实现了上下文的&#xff0c;上一节使用了一下中间件&#xff0c;这一节来实现 koa 的中间件这个洋葱模型。 思路&#xff1a; 储存用户所有的 callback将用户传递的 callback 全部组合起来&#xff08;redux 里的 compose&#xff09;组合成一个线性结构依次执行&#…