【强化算法专题一】双指针算法

【强化算法专题一】双指针算法

  • 1.双指针算法--移动零
  • 2.双指针算法--复写零
  • 3.双指针算法--快乐数
  • 4.双指针算法--盛水最多的容器
  • 5.双指针算法--有效三角形的个数
  • 6.双指针算法--和为s的两个数
  • 7.双指针算法--三数之和
  • 8.双指针算法--四数之和

1.双指针算法–移动零

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution {
public://双指针:本质就是划分数组,数组分块
//cur:用来遍历数组,将数组分成两个部分,[o,cur-1]已经处理的部分[cur,n-1]待处理的部分
//已经处理的部分要求是什么呢?非0元素在前面,0元素在后面,那么我们利用dest指针来作为它们的分割线
//dest:已经处理的部分又被dest分割成两部分,[0,dest]是非0部分,而[dest+1,cur-1]就是0部分
//所以数组总体被分成三部分void moveZeroes(vector<int>& nums) {int cur=0;int dest=cur-1;while(cur<nums.size()){if(nums[cur]==0){//当遇到0时不需要放入des区间,因为des区间里都是非0的cur++;}else{//当遇到非0时,就需要放入des区间,放进一个元素dest就要往后挪动一下,流出位置//但不能覆盖要交换dest++;swap(nums[dest],nums[cur]);cur++;}} }
};

2.双指针算法–复写零

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution 
{
public:void duplicateZeros(vector<int>& arr){//第一步找最后一个复写的数据int cur=0,dest=-1,n=arr.size();while(cur<n){if(arr[cur])dest++;else dest+=2;//dest每次走完都要判断一下是否到头if(dest>=n-1)break;cur++;}//特殊情况处理if(dest==n){arr[n-1]=0;dest-=2;cur--;}//正常往前复写while(cur>=0){if(arr[cur])arr[dest--]=arr[cur--];else{arr[dest--]=0;arr[dest--]=0;cur--;}}}
};

3.双指针算法–快乐数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution 
{
public:int work(int n){int ret=0;while(n){ret+=(n%10)*(n%10);n=n/10;}return ret;}bool isHappy(int n) {int slow=n,fast=n;//判断快慢指针相遇while(slow&&fast){slow=work(slow);//慢指针每次走1次操作fast=work(work(fast));//快指针每次走2次操作if(fast==slow){if(fast==1)return true;elsereturn false;}}return false;}
};

4.双指针算法–盛水最多的容器

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】


class Solution {
public:int lower(int x,int y){if(x<y)return x;else return y;}int maxArea(vector<int>& height) {vector<int> vt;int left=0,right=height.size()-1,V=0;while(left<right){V=(right-left)*(lower(height[left],height[right]));vt.push_back(V);if(height[left]<height[right])++left;else--right;}sort(vt.begin(),vt.end());return vt[vt.size()-1]; }
};

5.双指针算法–有效三角形的个数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());//首先优化数组,先排序int ret=0,ci=nums.size()-1;//首先固定的是最大值while(ci>=0){int left=0,right=ci-1;//在最大值前面的区间里利用双指针算法while(left<right){if(nums[left]+nums[right]>nums[ci]){ret+=right-left;right--;}else{left++;}}ci--;}return ret;}};

6.双指针算法–和为s的两个数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {//使用双指针算法int left=0,right=nums.size()-1;while(left<right){if(nums[left]+nums[right]>target)--right;else if(nums[left]+nums[right]<target)++left;elsereturn {nums[left],nums[right]};//大括号,这样写会发生隐射类型转化,调用vector的构造函数来构造}return {-1,-1};}
};

7.双指针算法–三数之和

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution 
{
public:vector<vector<int>> threeSum(vector<int>& nums) {//首先优化数组,对数组排序sort(nums.begin(),nums.end());//首先固定一个元素a,对后面的区间使用双指针算法,筛选//筛选的过程中要注意去重int ti=0;vector<vector<int>> vv;while(ti<nums.size()-1){//这里要有一个小优化,排完序后,0后面肯定都是正数,整数固定以后后面不可能能找到负数了//所以直接可以跳过就不用固定了if(nums[ti]>0)break;//对后面的区间使用双指针算法int left=ti+1,right=nums.size()-1,target=-nums[ti];while(left<right){if(nums[left]+nums[right]>target){right--;}else if(nums[left]+nums[right]<target){left++;}else//说明找到这个三元组了{vv.push_back({nums[ti],nums[left],nums[right]});//当找到一对满足条件的元素时,left和right要同时挪动,接下剩下的区间继续寻找//但要根据要去重,我们得注意下次如果再遇到上次的元素还是直接跳过去left++;right--;while(nums[left]==nums[left-1]&&left<right)left++;//还要注意避免越界left<rightwhile(nums[right]==nums[right+1]&&left<right)right--;}}//最后还要注意对固定的元素进行去重,因为当固定相同的元素时,也会出现重复的int later=ti;++ti;while(nums[later]==nums[ti]&&ti<nums.size()-1)//避免越界++ti;}return vv;}
};

8.双指针算法–四数之和

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> vv;//第一步给数组排序sort(nums.begin(),nums.end());//依次固定一个数a  找target-afor(int i=0;i<nums.size();){int a=nums[i];//依次固定一个数bfor(int j=i+1;j<nums.size();){int b=nums[j];long long tar=(long long)target-a-b;//在b后面的区间里使用双指针算法找  target-a-bint left=j+1,right=nums.size()-1;while(left<right){if(nums[left]+nums[right]<tar)left++;else if(nums[left]+nums[right]>tar)right--;else{vv.push_back({a,b,nums[left],nums[right]});left++;right--;//首先放入数组里,left和right各自走一步//然后检查后面的值是否有相同的,如果是相同的那就跳过while(nums[left]==nums[left-1]&&left<right)++left;while(nums[right]==nums[right+1]&&left<right)--right;}//b也要注意后面如果有相同的也要跳过}j++;while(j<nums.size()&&nums[j-1]==nums[j])j++;}i++;while(i<nums.size()&&nums[i-1]==nums[i])i++;}return vv;}
};

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

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

相关文章

java开发岗位面试

java开发岗位面试 技术栈&#xff1a;springboot框架&#xff0b;redis 个人笔试/技术面问题整理 1、SpringBoot有什么组件&#xff1f; 举例说几个&#xff1a; ①auto-configuration组件&#xff1a;核心特征。其约定大于配置思想&#xff0c;赋予了SpringBoot开箱即用的强…

Maven-DskipTests和-Dmaven.test.skip=true的区别

DskipTeststrue和-Dmaven.test.skiptrue的区别 1、 -DskipTeststrue 不执行测试用例&#xff0c;但编译测试用例类生成相应的class文件至target/test-classes下&#xff0c;如&#xff1a; mvn clean package -DskipTeststrue2、 -Dmaven.test.skiptrue 完全忽略测试代码的…

maui 开发AMD CPU踩的坑。

刚换的 amd R7735HS 笔记本&#xff0c;8核16线程&#xff0c;32GB内存。性能得实强悍 。 当需要发布iOS版本时发现&#xff0c;我没有macos &#xff0c;那就安装个vmware 吧。看了一下Apple 要求以后的发布的APP需要以xcode14.3或以后版本开发的版本&#xff0c;但xcode14.3…

oracle 乱码(编码为AMERICAN_AMERICA.US7ASCII)问题解决

案例 &#xff1a;mysql数据同步到oracle 注意&#xff1a; 不要使用navicat&#xff0c;navicat有自己的编码&#xff0c;使用plsql客户端查看数据&#xff0c;plsql客户端与oracle编码保持一致即可 service类 本地用的多数据源 com.baomidou dynamic-datasource-spring-boot…

c++内存对齐

原文在这里。https://blog.csdn.net/WangErice/article/details/103598081 但是内容有错误。我在自己的这里修改并变成红色了。 内存在使用过程并不是单一的依次排列&#xff0c;而是按照某种既定的规则来进行对齐&#xff0c;以方便快速访问.内存的对齐原则有以下三条&#…

深度学习与python theano

文章目录 前言1.人工神经网络2.计算机神经网络3.反向传播4.梯度下降-cost 函数1.一维2.二维3.局部最优4.迁移学习 5. theano-GPU-CPU theano介绍1.安装2.基本用法1.回归2.分类 3.function用法4.shared 变量5.activation function6.Layer层7.regression 回归例子8.classificatio…

【JavaScript】读取本地json文件并绘制表格

本文为避免跨域问题&#xff0c;使用了改造过的本地json文件的方法实现读取json数据并绘制表格。 如果发起http请求获取本地 json文件中数据&#xff0c;需要架设本地服务器&#xff0c;本文不做阐述。 概述 1、json在本地&#xff0c;并不需要从服务器下载。 2、采用jquery…

国庆作业day5

应用层&#xff1a;提供用户与网络应用程序之间的接口。表示层&#xff1a;负责数据的格式转换、加密和解密。会话层&#xff1a;负责建立、管理和终止会话。它提供会话控制和同步&#xff0c;允许应用程序之间建立连接和交换数据。传输层&#xff1a;提供端到端的连接。网络层…

postgresql-管理数据表

postgresql-管理数据表 创建表数据类型字段约束表级约束模式搜索路径 修改表添加字段删除字段添加约束删除约束修改字段默认值修改字段数据类型重命名字段重命名表 删除表 创建表 在 PostgreSQL 中&#xff0c;使用 CREATE TABLE 语句创建一个新表&#xff1a; CREATE TABLE …

专业PDF编辑阅读工具PDF Expert mac中文特点介绍

PDF Expert mac是一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 PDF Expert mac软件特点 PDF编辑&#xff1a;PDF Expert提供了丰富的PDF编辑功能&#xff0c;包括添加、删除、移动、旋转、缩放、裁剪等操作…

树莓派4B与STM32串口通信

目录 2上篇文章的补充 2.1 树莓派通信设置 3树莓派与STM32通信 3.1接线准备 3.2代码 3.2.1 STM32代码&#xff1a; 3.2.2树莓派代码&#xff1a; 2上篇文章的补充 2.1 树莓派通信设置 在上篇文章的基础上&#xff0c;进一步的设置 终端输入&#xff1a;sudo minicom …

v-for中的key

在Vue中&#xff0c;当使用v-for指令循环渲染元素时&#xff0c;添加:key是一个推荐做法&#xff0c;尤其是在循环的元素可能会被重新排序、添加或删除的情况下。 :key的作用是为每个循环的元素提供一个唯一的标识符&#xff0c;以便Vue能够跟踪和管理这些元素的状态。Vue使用…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 核心类持久化存储

文章目录 一、持久化存储的方式与路径二、公共模块序列化 / 反序列化异常规定 三、持久化存储数据库数据管理文件数据管理读写规定新增 /删除规定内存中 Message 的规定存储规定代码编写 硬盘数据管理 一、持久化存储的方式与路径 交换机,队列,绑定关系,这些我们使用数据库来管…

四、浏览器渲染过程,DOM,CSSDOM,渲染,布局,绘制详细介绍

知识点&#xff1a; 1、为什么不能先执行 js文件&#xff1f;&#xff1f; 我们不能先执行JS文件&#xff0c;必须等到CSSOM构建完成了才能执行JS文件&#xff0c;因为前面已经说过渲染树是需要DOM和CSSOM构建完成了以后才能构建&#xff0c;而且JS是可以操控CSS样式的&#…

编程前置:处理Excel表格,定位单元格位置,输入文字前,让AI机器人知道我说什么

原提问&#xff1a; input输入表头 &#xff08;input内除了/&#xff0c;空格 回车 标点符号等 全部作为单元格分隔符&#xff09; 由我设置input输入的是行or列 给选项 1. 行 2. 列 默认回车或没输入值是列由我设置起始位置行列 例如 3,2 表示3行2列 当我输入3,2 就表示在第…

【Java】继承练习

继承的思想实现猫和狗的案例&#xff0c;并在测试类中进行测试 猫和狗——共同特性都是属于动物 1. 定义动物类&#xff08;Animal&#xff09; 成员变量&#xff1a;姓名&#xff0c;年龄构造方法&#xff1a;无参&#xff0c;带参成员方法&#xff1a;get/set 方法 2. 定义猫…

springboot的配置文件(properties和yml/yaml)

springboot的配置文件有两种格式分别是properties和yml/yaml 创建配置文件 在创建springboot项目时候&#xff0c;会默认生成application.properties这种格式 书写风格 端口 application.propertis server.port8080 application.yml server:port: 8080 连接数据库 applica…

<Xcode> Xcode IOS无开发者账号打包和分发

关于flutter我们前边聊到的初入门、数据解析、适配、安卓打包、ios端的开发和黑苹果环境部署&#xff0c;但是对于苹果的打包和分发&#xff0c;我只是给大家了一个链接&#xff0c;作为一个顶级好男人&#xff0c;我认为这样是对大家的不负责任&#xff0c;那么这篇就主要是针…

【计算机网络黑皮书】应用层

【事先声明】 这是对于中科大的计算机网络的网课的学习笔记&#xff0c;感谢郑烇老师的无偿分享 书籍是《计算机网络&#xff08;自顶向下方法 第6版&#xff09;》 需要的可以私信我&#xff0c;无偿分享&#xff0c;课程简介下也有 课程连接 目录 应用层网络应用的原理应用架…

作业 day4

完成父子进程通信