【C++算法】双指针

移动零

题目链接:移动零icon-default.png?t=N7T8https://leetcode.cn/problems/move-zeroes/description/

  • 算法原理

这类题是属于数组划分、数组分开题型

  • 代码步骤:
  1. 使用cur遍历数组
  2. 当cur所指的元素等于0时,cur向后面移动
  3. 当cur所指的元素不等于0时,dest向后面移动,cur所指元素与dest移动后所指的元素交换
  4. 当cur指向最后一个元素的下一个时,结束。
  • 代码展示
class Solution {
public:void moveZeroes(vector<int>& nums) {int dest = -1;for(int cur = 0; cur < nums.size(); ++cur){//如果cur所指的元素非0,交换if(nums[cur] != 0){swap(nums[++dest], nums[cur]);}}}
};

复写零

题目链接:

复写零icon-default.png?t=N7T8https://leetcode.cn/problems/duplicate-zeros/description/

  • 算法原理

  • 代码步骤:

  • 代码展示
class Solution {
public:void duplicateZeros(vector<int>& arr) {//寻找复写的最后一个元素int cur = 0;int dest = -1;int n = arr.size();//注意arr.sizr()是size_t无符号类型//int(-1)比size_t整数大while(cur < n){if(arr[cur]){++dest;}else{dest += 2;}//注意这个判断条件需要在里面实现//如果在整个循环结束判断,cur的值无法保证if(dest >= n-1) break;cur++;}//特殊情况处理if(dest == n){arr[n - 1] = 0;--cur;dest -= 2;}//进行从右向左的复写操作for(; cur >= 0; --cur){if(arr[cur]){arr[dest--] = arr[cur];}else{arr[dest--] = 0;arr[dest--] = 0;}}  }
};

快乐数

题目链接:

快乐数icon-default.png?t=N7T8https://leetcode.cn/problems/happy-number/submissions/552733314/

  • 算法原理

  • 代码步骤:

采用快慢双指针的思想:

  1. 定义快慢双指针
  2. 设置一个每个位置平方和的函数
  3. 慢指针每次向后移动一步
  4. 快指针每次向后移动俩步
  5. 判断快慢指针相遇的时候的值是否为1即可
  • 代码展示
class Solution {
public://计算数每个位置上数字的平方和int SquareSum(int n){int sum =0;while(n > 0){int num = n % 10;sum += num * num;n /= 10;}return sum;}bool isHappy(int n) {int slow = n;int fast = SquareSum(n);while(slow != fast){fast = SquareSum(SquareSum(fast));slow = SquareSum(slow);}if(slow == 1){return true;}else {return false;}}
};

盛最多水的容器

题目链接:

盛最多水的容器icon-default.png?t=N7T8https://leetcode.cn/problems/container-with-most-water/

  • 算法原理

  • 代码步骤:
  1. 记录初始w最大时的初始容积
  2. left与right二者中较小者向里面移动,寻找比自己大的值
  3. 找到比自己大的值,记录面积,并与之前的面积比较大小
  4. 当left与right相遇的时候,结束
  • 代码展示
class Solution 
{
public:int maxArea(vector<int>& height) {int left = 0;int right = height.size() - 1;//寻找边界的最小值int min = (height[left] < height[right]) ? height[left] : height[right];//起始容积int vmax = min * (right - left);while(left < right){if(height[left] < height[right]){//记录此时的leftint num = left;while(left < right){//比较看是否有比height[left]大的值++left;if(height[num] < height[left]){break;}}}else{//记录此时的leftint num = right;while(left < right){//比较看是否有比height[left]大的值--right;if(height[num] < height[right]){break;}}}min = (height[left] < height[right]) ? height[left] : height[right];int v = min * (right - left);vmax = (v > vmax) ? v : vmax; }return vmax;}
};
class Solution {
public:int maxArea(vector<int>& height) {int left = 0, right = height.size() - 1, vmax = 0;while(left < right){int v = min(height[left], height[right]) * (right - left);vmax = max(vmax, v);if(height[left] < height[right]) ++left;else --right;}return vmax;}
};

有效三角形个数

题目链接:

有效三角形个数icon-default.png?t=N7T8https://leetcode.cn/problems/valid-triangle-number/

  • 算法原理

  • 代码步骤:
  1. 对数组进行排序
  2. 设置三个指针,一个指向最大值,另外俩个形成单调双指针
  3. 当left + right < max时,个数为right-left,right--
  4. 当left + right >= max时,个数为0,left++
  • 代码展示
class Solution {
public:int triangleNumber(vector<int>& nums) {int n = nums.size();//排序升序sort(nums.begin(), nums.end());int sum = 0;//最大值向前移动while(n >= 2)//确保right不越界{int max = nums[n - 1];int left = 0, right = n - 2;//利用单调性使用双指针while(left < right){if(nums[left] + nums[right] > max){sum += (right - left);right--;}else{left++;}}--n;}return sum;}
};

三数之和

题目链接:

三数之后icon-default.png?t=N7T8https://leetcode.cn/problems/3sum/

  • 算法原理

  • 代码步骤:
  1. 排序
  2. 固定一个数min(注意当min > 0的时候,也是可以直接结束的)
  3. 在该数的后面的区间之内,利用单调性使用双指针,快速找到俩个和等于-min的值
  4. 细节1:不漏数据
  5. 细节2:去重操作
  • 代码展示
class Solution 
{
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> vv;//排序sort(nums.begin(), nums.end());int n = nums.size();//固定一个数int min = 0;for(int min = 0; min < n - 2; ++min){//优化if(nums[min] > 0) break;int left = min + 1, right = n - 1;while(left < right){if(nums[left] + nums[right] < -nums[min]){left++;}else if(nums[left] + nums[right] > -nums[min]){right--;}else{//添加数据vv.push_back({nums[min], nums[left], nums[right]});while(left < right && nums[left] == nums[left + 1]){left++;}while(left < right && nums[right] == nums[right - 1]){right--;}if(left < right){left++;right--;}}}while(min < n - 2 && nums[min] == nums[min + 1]){min++;}}return vv;}
};

四数之和

题目链接:

四数之和icon-default.png?t=N7T8https://leetcode.cn/problems/4sum/description/

  • 算法原理

  • 代码步骤:

  • 代码展示
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();//四数之和for(int minA = 0; minA < n;){long targetA = target - nums[minA];//三数之和for(int minB = minA + 1; minB < n;){long targetB = targetA - nums[minB];int left = minB + 1, right = n - 1;while(left < right){//利用单调性使用双指针if(nums[left] + nums[right] < targetB){left++;}else if(nums[left] + nums[right] > targetB){right--;}else{ret.push_back({nums[minA], nums[minB], nums[left], nums[right]});//left不重while(left + 1 < right && nums[left] == nums[left + 1]){left++;}//right不重while(left < right - 1 && nums[right] == nums[right - 1]){right--;}//不漏if(left < right){left++;right--;}}}//minB不重while(minB + 1 < n && nums[minB] == nums[minB + 1]){minB++;}++minB;}//minA不重while(minA + 1 < n && nums[minA] == nums[minA + 1]){minA++;}++minA;}return ret;}
};  

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

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

相关文章

JAVA—异常

认识异常&#xff0c;学会从报错信息中发现问题&#xff0c;解决问题。并学会构建自定义异常&#xff0c;提醒编程时注意 目录 1.认识异常 2.自定义异常 1.自定义运行时异常 2.自定义编译时异常 3.异常的处理 1.认识异常 异常就是代表程序出现的问题&#xff0c;用来查询B…

(自用)交互协议设计——protobuf序列化

protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式&#xff0c;性能比json和xml真的强很多&#xff0c;毕竟google出品。 protobuf原理 protobuf如何使用 创建xxx.proto文件 开头写上 syntax"proto2"package tutorial; 表明使用的proto…

机器学习——支持向量机(SVM)(2)

目录 一、SVC理解进阶 1. C&#xff08;硬间隔与软间隔&#xff09; 2. class_weight 二、模型评估指标&#xff08;SVC&#xff09; 1. 混淆矩阵 &#xff08;Confusion Matrix&#xff09; &#xff08;1&#xff09;准确率 —— 模型整体效果 &#xff08;2&#xff…

Spring AI 更新:支持OpenAI的结构化输出,增强对JSON响应的支持

就在昨晚&#xff0c;Spring AI发了个比较重要的更新。 由于最近OpenAI推出了结构化输出的功能&#xff0c;可确保 AI 生成的响应严格遵守预定义的 JSON 模式。此功能显着提高了人工智能生成内容在现实应用中的可靠性和可用性。Spring AI 紧随其后&#xff0c;现在也可以对Open…

STM32CubleMX创建FreeRtos工程教程,图文教程

前言&#xff1a;STM32CubeMX 是一个开发工具&#xff0c;它已经将 FreeRTOS 这个实时操作系统&#xff08;RTOS&#xff09;集成到其工具中。换句话说&#xff0c;通过 STM32CubeMX&#xff0c;可以非常方便地为 STM32 微控制器生成配置代码&#xff0c;其中包括对 FreeRTOS 的…

jdbc操作数据库MySQL

mysql创建class表 往数据库中使用代码插入一条数据 step1.创建DataSource DataSource dataSource new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncodingutf8&usessLfalse");((MysqlDataSour…

2024十大网站设计公司推荐TOP10

一个精心设计的网站对于企业来说不仅是品牌形象的延伸&#xff0c;也是吸引客户、提升业务的关键工具。 而选择一家专业的网站设计公司&#xff0c;不仅可以帮助企业在激烈的市场竞争中脱颖而出&#xff0c;还能收获更多的客流量&#xff0c;以下是我们精选的十大网站设计公司…

LVS负载均衡+集群+三种工作模式+调度算法及实战案例

一、LVS 1.1简介 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是由章文嵩主导开发的开源负载均衡项目&#xff0c;目前&#xff0c;LVS已经被集成到Linux内核模块中。该项目实现了在基于IP的数据基础上&#xff0c;请求负载均衡调度方案&a…

git推送错误-->远程分支比本地的分支更新,无法直接推送

每次上传本地修改好的代码的时候,十次有八次都会出现这样的问题!!(暴躁!!!) 现在写个帖子记录一下,这个问题目前我还没有解决,欢迎懂的佬指点一下. 情景: 我在本地仓库做了一些代码的修改,准备上传到远程仓库上,下边是上传步骤: git add . # 将所有的修改都提交到缓冲区git …

工作随记:oracle中偶发遇到存储过程编辑,删除等卡死问题

文章目录 一、查询session是否占用二、通过对象名称定位对应SID三、通过对应的SID查询session信息四、kill掉session 最近有几个客户也询问过&#xff1a;我的存储过程怎么编译、调试有时候就卡死不动了&#xff0c;而且还没办法删除&#xff0c;本次又碰到实际情况&#xff0c…

sql及rce漏洞整理

sql及rce漏洞复现 一&#xff0c;mysql小特性解决大问题 <?php $mysqli new mysqli("localhost", "root", "root", "cat"); ​ /* check connection */ if ($mysqli->connect_errno) {printf("Connect failed: %s\n&qu…

前端面试题整合

一、HTML篇 1、简述一下你对HTML语义化的理解&#xff1f; 用正确的标签做正确的事情&#xff1b; HTML语义化让页面内容结构清晰&#xff0c;便于浏览器、搜索引擎解析&#xff1b; 搜索引擎的爬虫依赖HTML标记来确定上下文和关键字的权重&#xff0c;利于SEO&#xff1b; 便于…

JavaScript - 数组对象中实用好玩的reduce方法

JavaScript中reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行)&#xff0c;将其结果汇总为单个返回值。 语法&#xff1a; arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]) 参数配置&#xff1a; 参数名描述cal…

渗透学习之漏洞复现

漏洞 贷齐乐的漏洞复现RCE 贷齐乐的漏洞复现 <?php header("Content-type: text/html; charsetutf-8"); require db.inc.php;function dhtmlspecialchars($string) {if (is_array($string)) {foreach ($string as $key > $val) {$string[$key] dhtmlspecial…

【Oracle点滴积累】解决ORA-20001: Latest xml inventory is not loaded into table故障的方法

广告位招租&#xff01; 知识无价&#xff0c;人有情&#xff0c;无偿分享知识&#xff0c;希望本条信息对你有用&#xff01; 今天和大家分享在安装Oracle Critical Patch Update (Patch Number:33806138) 遇到ORA-20001: Latest xml inventory is not loaded into table故障…

广东盈致MES系统——注塑和冲压行业的智能化管理

广东注塑冲压行业MES制造执行系统是一种专门为注塑和冲压行业设计的生产管理系统&#xff0c;可以帮助企业实现生产过程的智能化管理和优化。盈致MES系统是一种常见的MES系统&#xff0c;具有以下特点和功能&#xff1a; 生产计划和调度&#xff1a;MES系统可以帮助企业进行生产…

SpringCloud网关

1.网关的作用 2.网关入门 2.1引入依赖 <dependencies><dependency><groupId>com.heima</groupId><artifactId>hm-common</artifactId><version>1.0.0</version></dependency><!--网关--><dependency><g…

SAP通过函数TR_RELEASE_REQUEST释放指定请求

一&#xff1a;不通过SE09/10释放请求号 *&---------------------------------------------------------------------* *& Report Z_TRANSPORT_REQUEST *&---------------------------------------------------------------------* *& *&----------------…

AI与人类智慧的共舞:程序员在人工智能时代的新角色

文章目录 每日一句正能量前言AI辅助编程对程序员工作的影响提高编码效率改善代码质量促进学习与成长改变工作流程潜在风险与挑战技术伦理与责任应对策略结论 程序员应重点发展的核心能力复杂系统设计能力跨学科知识整合能力与AI协作的能力创新和解决问题的能力技术领导力和团队…

ctfshow-web入门-sql注入(web206-web210)系统练习sqlmap之tamper的使用与编写

目录 1、web206 2、web207 3、web208 4、web209 5、web210 1、web206 sql需要闭合 测了一下还是会先请求 /api/getToken.php 查询语句里新增了括号&#xff0c;我们注入也需要将其闭合掉&#xff0c;就像我们闭合单引号那样&#xff0c;对于 sqlmap 它会自动对闭合点进行…