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

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

  • 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.xdnf.cn/news/147715.html

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

相关文章

普通人需要做副业吗?有什么合适的副业

普通人现在需要做副业吗&#xff0c;我觉得有这个必要&#xff0c;当然也要根据个人情况选择&#xff0c;那么做副业有什么好处呢&#xff1f;做副业可以带来额外的收入&#xff0c;增加灵活性&#xff0c;提升技能&#xff0c;发展创造力&#xff0c;降低风险&#xff0c;提供…

计算机竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

【高强度聚焦超声模拟器】模拟分层介质中的高强度聚焦超声波束和加热效应(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

实体行业数字化转型怎么做?线上线下相结合的新零售体系怎么做?

如今&#xff0c;实体行业想要取得收入增长&#xff0c;只做线下业务或者只做线上业务&#xff0c;在当前的市场环境中是难以长久生存的&#xff0c;因此一定要线上线下相结合&#xff0c;将流量运作与线下转化进行充分结合&#xff0c;才能更好地发挥实体优势&#xff0c;带来…

Java后端模拟面试,题集①

1.Spring bean的生命周期 实例化 Instantiation属性赋值 Populate初始化 Initialization销毁 Destruction 2.Spring AOP的创建在bean的哪个时期进行的 &#xff08;图片转载自Spring Bean的完整生命周期&#xff08;带流程图&#xff0c;好记&#xff09;&#xff09; 3.MQ如…

毛玻璃用户卡交互

效果展示 页面结构组成 从效果展示可以看到&#xff0c;此效果都是比较常规的。主要的核心就是卡片的悬停效果。 CSS 知识点 backdrop-filter 回顾transitiontransform 页面基础布局实现 <section><div class"container"><div class"card&q…

第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项

视频教程汇总帖&#xff1a;【学以致用&#xff0c;授人以渔】2023视频教程汇总&#xff0c;DSP第12期&#xff0c;ThreadX第8期&#xff0c;BSP驱动第26期&#xff0c;USB实战第5期&#xff0c;GUI实战第3期&#xff08;2023-10-01&#xff09; - STM32F429 - 硬汉嵌入式论坛 …

【springboot3.x 记录】关于spring-cloud-gateway引入openfeign导致的循环依赖问题

最近升级springboot3真是一挖一个坑&#xff0c;又给我发现了 spring-cloud-gateway 引入 openfeign 会导致循环依赖异常&#xff0c;特此记录一下这个坑 一、发现问题 网关里面有一个全局的过滤器&#xff0c;因为要查询一些配置信息&#xff0c;目前是通过 feign client 的方…

掌机小霸王,开源俄罗斯方块小游戏

俄罗斯方块试玩gi PC或手机 点开即玩: https://chvin.github.io/react-tetris/?lanzh-cn 也可以扫码开玩: 实现了数据的持久化 游戏进度的数据可以持久存储到本地浏览器, 即使刷新网页也无需重新开始游戏 小结: 俄罗斯方块属于超级经典的游戏, 感兴趣可以玩一下, 找回一点童…

【初识Linux】上

初识Linux上 一、Linux背景1.1 UNIX发展的历史1.2 UNIX发展的历史 二、开源三、官网Linux官网 四、企业应用现状五、发行版本六、 os概念&#xff0c;定位 本博客简介 初始Linux操作系统初识shell命令 ,了解若干背景知识。使用常用Linux命令了解Linux权限概念与思想,能深度理解…

AMD GPU 内核驱动分析(三)-dma-fence 同步工作模型

在Linux Kernel 的AMDGPU驱动实现中&#xff0c;dma-fence扮演着重要角色&#xff0c;AMDGPU的Render/解码操作可能涉及到多个方面同时引用buffer的情况&#xff0c;以渲染/视频解码场景为例&#xff0c;应用将渲染/解码命令写入和GPU共享的BUFFER之后&#xff0c;需要将任务提…

海外媒体发稿:商务视频推广销售利器之完全指南

在当今数字化时代&#xff0c;商务视频推广已经成为了企业获取市场份额和提升销售业绩的重要手段。视频作为一种视听媒体&#xff0c;拥有更强大的感染力和传达信息的能力&#xff0c;因此在各种销售场景中得到了广泛应用。本文为大家提供了一份完全指南&#xff0c;帮助你了解…

代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值

题目详细思路和解法来自于:代码随想录 (programmercarl.com) LeetCode T20 有效的括号 题目思路 这道题分为三种情况 1.左括号多了 ([{}]() 2.括号不匹配 [{(]}] 3.右括号多了 []{}()))) 处理思路:我们在遇到左括号的时候,直接入栈其对应的右括号即可…

【Java】微服务——微服务介绍和Eureka注册中心

目录 1.微服务介绍2.服务拆分和远程调用2.1.提供者与消费者 3.Eureka注册中心3.1.Eureka的结构和作用3.2.Eureka的结构3.3.搭建Eureka服务3.3.1.引入eureka依赖3.3.2.编写配置文件 3.4.服务注册及拉1&#xff09;引入依赖2&#xff09;配置文件3&#xff09;启动多个user-servi…

UE5.1编辑器拓展【二、脚本化资产行为,快速更改资产名字,1.直接添加前缀或后缀2.通过资产类判断添加修改前缀】

目录 了解相关的函数 第一种做法&#xff1a;自定义添加选择资产的前缀或后缀 代码 效果 第二种做法&#xff1a;通过映射来获取资产类型添加前缀和修改前缀 映射代码 代码 效果 在之前一章中&#xff0c;我们创建了插件&#xff0c;用来扩展编辑器的使用&#xff1a; …

【高阶数据结构】哈希(哈希表、哈希桶)

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C进阶 ⭐代码仓库&#xff1a;C进阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

微服务技术栈-认识微服务和第一个微服务Demo

文章目录 前言一、认识微服务二、微服务技术栈三、Eureka注册中心四、微服务DEMO1、搭建eureka-server2、服务注册和服务发现 总结 前言 随着业务的不断复杂&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。 本章就从微服…

VD6283TX环境光传感器驱动开发(1)----获取ID

VD6283TX环境光传感器驱动开发----1.获取ID 概述视频教学样品申请源码下载模块参数IIC接线方式设备ID生成STM32CUBEMX串口配置 IIC配置串口重定向模块地址获取ID主函数结果演示 概述 环境光传感器是一种光电探测器&#xff0c;能够将光转换为电压或者电流&#xff0c;使用多光…

计算机网络常见面试题

梳理计算机网络相关的面试题&#xff0c;相关知识结构主要参考谢希仁老师的《计算机网络&#xff08;第五版&#xff09;》一书&#xff0c;并整理互联网上常见面试题。 计算机网络性能指标 性能指标从不同的方面来度量计算机网络的性能。下面介绍常用的七个性能指标。 1、速…

23-properties文件和xml文件以及dom4j的基本使用操作

特殊文件 我们利用这些特殊文件来存放我们 java 中的数据信息&#xff0c;当数据量比较大的时候&#xff0c;我们可以利用这个文件对数据进行快速的赋值 对于多个用户数据的存储的时候我们要用这个XML来进行存储 关于这些特殊文件&#xff0c;我们主要学什么 了解他们的特点&…