【算法】双指针

下面是对双指针算法的题目总结和归纳,有需要借鉴即可。

双指针算法习题目录

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

1.移动零

题目链接:LINK
在这里插入图片描述

题解:

  • 思路①:暴力求解

    • 详述:碰到0,后面所有数字往前挪动一位;碰到非0不用管。
    • 时间复杂度:O(N^2)
  • 思路②:双指针算法

    • 详述:定义两个指针pcur和pdest,pcur起始位置在0下标处,用来遍历数组;pdest起始位置在-1.用来保留要交换数字的下标;如果pcur遇到非0,那就dest与pcur位置的值进行交换,如果是0,pcur继续向后走,不做处理。
    • 时间复杂度:O(N)
class Solution {
public:void Swap(int& x,int& y){int temp = x;x = y;y = temp;}void moveZeroes(vector<int>& nums) {int pcur = 0;int pdest = -1;while(pcur < nums.size())//遍历完成就结束{//不是0,我们就换一下if(nums[pcur] != 0){Swap(nums[++pdest],nums[pcur]);}        pcur++;}}
};

2.复写零

题目链接:LINK
在这里插入图片描述

题解:

  • 思路①:暴力求解
    • 详述:定义一个指针,一个pcur,扫描,如果pcur找到的是非0,那就不用管,;如果pcur找到的是0,那就把该数组所有元素往后移动一位,并且把该位置置为0。
    • 复杂度:O(N^2)
  • 思路②:双指针法
    • 详述:定义两个指针,先大致模拟一下最后pcur和dest最后结果在哪,然后从后向前进行复写。
    • 复杂度:O(N)
class Solution {
public:void duplicateZeros(vector<int>& arr) {int cur = 0,dest = -1,n = arr.size();//1.先找到cur和dest应该指向的位置while(cur < n){if(arr[cur])//非0{dest++;}else{dest+=2;}if(dest>=n-1)//终止条件:dest到达最后一个地方或者说超出了{break;}cur++;}//2.处理一下特殊情况if(dest == n){arr[--dest] = 0;cur--;dest--;}//3.依次赋值while(cur>=0){if(arr[cur])//如果说是非0{arr[dest--] = arr[cur--];}else//如果说是0{arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
};

3.快乐数

题目链接:LINK
在这里插入图片描述

题解:

  • 思路①:双指针算法
    • 详述:定义一个slow指针,每次算一次;定义一个fast指针,每次算两步,当slow == fast且是1时候则返回true;如果slow==fast且不是1,则返回false;
    • 时间复杂度:O(N)
class Solution {
public:int bitsum(int n){int sum = 0;while(n){sum+=(n%10)*(n%10);n/=10;}return sum;}bool isHappy(int n) {//1.定义两个指针int slow = bitsum(n);int fast = bitsum(bitsum(n));while(slow != fast){slow = bitsum(slow);fast = bitsum(bitsum(fast));}return slow == 1;}
};

4.盛最多水的容器

题目链接:LINK
在这里插入图片描述

题解:

  • 思路①:暴力求解
    • 详述:定义两个指针,依次枚举,取最大值
    • 时间复杂度:O(N^2)
  • 思路②:双指针算法
    • 详述:定义两个指针,一个指向0下标处,另一个指向最后一个下标处,算出此时容器体积大小,然后如果left指针小,则left++,如果right小,则right–,依次类推,找出其中的最大值就好。
    • 时间复杂度:O(N)
class Solution {
public:int maxArea(vector<int>& height) {int first = 0,last = height.size()-1,ret = 0;while(first<last){ret = max(ret,(last - first) * min(height[first],height[last]));//移动指针if(height[first] < height[last]){first++;}else{last--;}}return ret;}
};

5.有效三角形的个数

题目链接:LINK
u

题解:

  • 思路①:暴力求解
    • 详述:一次列举各种情况,进行求证即可。
    • 时间复杂度:O(N^3)
  • 思路②:双指针算法
    • 详述:开始首先排序,再固定一个后面的大数,再定义两个指针,如果left+right处的值大于固定的数,那么就直接加上个数,如果小,就left++即可,以此类推。
    • 时间复杂度:O(N^2)
class Solution {
public:int triangleNumber(vector<int>& nums) {//先排序sort(nums.begin(),nums.end());//定义三个指针,一个用来固定位置,另外两个用来找int count = 0;for(int i = nums.size() - 1;i>=2;i--)//先固定一个数字{int left = 0;int right = i - 1;while(left < right){if(nums[left] + nums[right] > nums[i]){count += right - left;right--;}else{left++;}}}return count;}
};

6.和为s的两个数

题目链接:LINK
在这里插入图片描述

题解:

  • 思路①:暴力求解
    • 详述:依次枚举,返回正确的数字
    • 时间复杂度:O(N^2)
  • 思路②:双指针算法
    • 详述:left在最左端,right在最右端,sum太大,right–,sum太小,left++,sum==s,返回
    • 时间复杂度:O(N)
class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {//定义两个指针,大了调小,小了调大,等于返回int left = 0,right = price.size() - 1;while(left < right){if((price[left] + price[right]) < target){left ++;}else if((price[left] + price[right]) > target){right --;}else{return {price[left] , price[right]} ;   }}return {0,0};}
};

7.三数之和

题目链接:LINK
在这里插入图片描述

题解:

  • 思路①:暴力求解
    • 详述:依次枚举,三重循环
    • 时间复杂度:O(N^3)
  • 思路②:双指针算法
    • 详述:固定一个数a,left在左端,right在右端,看sum与-a的大小,若sum较大,right–,如果sum较小,那就left++…同时还应该注意去重问题。
    • 时间复杂度:O(N^2)
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;//排序sort(nums.begin(),nums.end());//for(int i = 0;i<nums.size();)//先固定一个数{int left = i + 1,right = nums.size() - 1,target = -nums[i];if(target < 0){break;}while(left < right){int sum = nums[left] + nums[right];if(sum > target){right--;}else if(sum < target){left++;}else{ret.push_back({nums[i],nums[left],nums[right]});left++,right--;//去重while(left<right && nums[left] == nums[left-1]){left++;}while(right>left && nums[right] == nums[right+1]){right--;}}}i++;while(i < nums.size() && nums[i] == nums[i-1]){i++;}}return ret;}
};

8.四数之和

题目链接:LINK
在这里插入图片描述

题解:

  • 思路①:暴力求解
    • 详述:依次枚举,四层循环
    • 时间复杂度:O(N^4)
  • 思路②:双指针算法
    • 详述:先固定一个数字,再借鉴”三数之和“的思路
    • 时间复杂度:O(N^3)
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target){sort(nums.begin(), nums.end());vector<vector<int>> ret;int n = nums.size();for (int a = 0; a < n;)//固定数a{for (int b = a + 1; b < n;)//固定数b{int left = b + 1, right = n - 1;long long LFtarget = (long long)target - nums[a] - nums[b];while (left < right){int LFsum = nums[left] + nums[right];if (LFsum > LFtarget){right--;}else if (LFsum < LFtarget){left++;}else{ret.push_back({ nums[a],nums[b],nums[left],nums[right] });left++, right--;//去重 left and rightwhile (left < right && nums[left] == nums[left - 1]){left++;}while (left < right && nums[right] == nums[right + 1]){right--;}}//end else}//end left and right whileb++;while (b < n && nums[b] == nums[b - 1]){b++;}}//end b whilea++;while (a < n && nums[a] == nums[a - 1]){a++;}}// end a whilereturn ret;}
};

EOF

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

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

相关文章

【备战软考(嵌入式系统设计师)】08 - 多媒体技术信息安全

多媒体技术 这内容比较杂&#xff0c;而且跟咱嵌入式的关系不大&#xff0c;但是软考里会考一些&#xff0c;下面我就结合我已经刷过的一千多道往年真题概括总结一下常考的知识点。 媒体分类 首先媒体分为五类&#xff1a; 感觉媒体&#xff0c;让人直接感觉得到的媒体&…

zTasker v1.88.1一键定时自动化任务

软件介绍 zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具&#xff0c;支持win7-11。其支持超过100种任务类型&#xff0c;50种定时/条件执行方法&#xff0c;而且任务列表可以随意编辑、排列、移动、更改类型&#xff0c;支持任务执行日志&a…

人脸美妆SDK解决方案,自研人脸美妆方案

美妆已经成为视频内容中不可或缺的一部分。从拍摄到编辑&#xff0c;再到直播&#xff0c;美妆效果都能为视频内容增添魅力&#xff0c;吸引更多观众的眼球。为了满足企业对于高质量美妆效果的需求&#xff0c;美摄科技凭借多年的技术积累和创新精神&#xff0c;推出了全新的人…

内容安全(DPI和DFI解析)

内容安全前言&#xff1a; 防火墙的本质其实就是包过滤&#xff0c;我们通常所说的安全设备&#xff08;如&#xff1a;IPS、IDS、AV、WAF&#xff09;的检测重心是应用层。下一代防火墙基于传统防火墙的拓展能力&#xff0c;就是可以将以上的安全设备模块集成在一起&#xff0…

智慧应急三维电子沙盘系统

深圳易图讯科技有限公司&#xff08;www.3dgis.top&#xff09;自主研发的智慧应急三维电子沙盘系统依托大数据融合物联网、云计算、移动互联、5G、BIM、三维GIS等新一代信息技术&#xff0c;集成了高清卫星影像、地形数据、实景三维模型、现场环境数据、物联感知信息、人口、建…

SRC公益漏洞挖掘思路分享

0x00 前言 第一次尝试挖SRC的小伙伴可能会觉得挖掘漏洞非常困难&#xff0c;没有思路&#xff0c;不知道从何下手&#xff0c;在这里我分享一下我的思路 0x01 挖掘思路 确定自己要挖的漏洞&#xff0c;以及该漏洞可能存在的功能点&#xff0c;然后针对性的进行信息收集 inurl…

一起深度学习(AlexNet网络)

AlexNet神经网络 代码实现&#xff1a; 代码实现&#xff1a; import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(# 采用了11*11的卷积核来捕捉对象&#xff0c;因为原始输入数据比较大#步幅为4 &#xff0c;可减少输出的高度核宽度。#输出通…

Compose 状态管理

文章目录 Compose 状态管理概述使用MutableStaterememberStatelessComposable & StatefulComposable状态提升rememberSaveable支持parceable不支持parceable 使用ViewModelViewModelProvider.Factory 使用Flow Compose 状态管理 概述 当应用程序的状态发生变化时&#xf…

(40)4.30数据结构(队列)

1.队列的基本概念 2.队列的顺序 #define MaxSize 10 #define ElemType int typedef struct { ElemType data[MaxSize]; int front, rear; }SqQueue;//1.初始化操作 void InitQueue(SqQueue& Q) { //初始化 队头&#xff0c;队尾指针指向0 Q.rear Q.fron…

环形链表理解||QJ141.环形链表

在链表中&#xff0c;不光只有普通的单链表。之前写过的的一个约瑟夫环形链表是尾直接连向头的。这里的环形链表是从尾节点的next指针连向这链表的任意位置。 那么给定一个链表&#xff0c;判断这个链表是否带环。qj题141.环形链表就是一个这样的题目。 这里的思路是用快慢指…

jenkins+gitlab+ansible-tower实现发布

前提准备&#xff1a; gitlab中上传相应的jenkinsfile文件和源码。 安装和破解ansible-tower。 安装jenkins。 大致流程&#xff1a;从gitlab中拉取文件&#xff0c;存放到windows机器上&#xff0c;使用nuget等进行打包到windows中&#xff0c;使用sshPublisher语句传输到远程…

LLMs之RAG:LangChain-Chatchat(一款中文友好的全流程本地知识库问答应用)的简介(支持 FastChat 接入的ChatGLM-2/LLaMA-2等多款主流LLMs+多款embe

LLMs之RAG&#xff1a;LangChain-Chatchat(一款中文友好的全流程本地知识库问答应用)的简介(支持 FastChat 接入的ChatGLM-2/LLaMA-2等多款主流LLMs多款embedding模型m3e等多种TextSplitter分词器)、安装(镜像部署【AutoDL云平台/Docker镜像】&#xff0c;离线私有部署支持RTX3…

yum仓库及NFS共享

yum简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 yum 实现过程 先在yum服务器上创建 yum repository&#xff08;仓库&#xff09;&#xff0c;在仓…

stm32f103zet6_DAC_2_输出电压

实现效果 DAC输出的电压 同过电压表测量电压 1.DAC配置的步骤 初始化DAC时钟。配置DAC的GPIO端口。设置DAC的工作模式&#xff08;例如&#xff0c;是否使用触发功能&#xff0c;是否启用DAC中断等&#xff09;。启动DAC。 2常用的函数 函数 HAL_DAC_Start() - 开启指定…

EtherCAT开发_4_分布时钟知识点摘抄笔记1

分布时钟 (DC&#xff0c;Distributed Cl ock) 可以使所有EtherCAT设备使用相同的系统时间&#xff0c;从而控制各设备任务的同步执行。从站设备可以根据同步的系统时间产生同步信号&#xff0c;用于中断控制或触发数字量输入输出。支持分布式时钟的从站称为 DC 从站。分布时钟…

ATA-2161高压放大器用途有哪些种类

高压放大器是一种电子设备&#xff0c;其主要功能是将输入信号放大到较高的电压水平&#xff0c;同时保持信号的形状和特性。这种设备在各种应用领域中都有重要作用&#xff0c;它的种类繁多&#xff0c;根据不同的用途可以分为多种类型。 1.医学领域 在医学设备中&#xff0c;…

Sermant在异地多活场景下的实践

Sermant社区在1.3.0和1.4.0版本相继推出了消息队列禁止消费插件和数据库禁写插件&#xff0c;分别用于解决异地多活场景下的故障切流和保护数据一致性问题。本文将对Sermant在异地多活场景下的实践进行剖析。 一、异地多活 1.1 什么是异地多活 对于一个软件系统&#xff0c;…

极致视觉盛宴,尽在Extreme Picture Finder!

在信息爆炸的时代&#xff0c;网络图片如同繁星点点&#xff0c;为我们的生活增添无尽的色彩。然而&#xff0c;如何在浩渺的网海中快速、准确地找到心仪的图片&#xff0c;却成了许多人的难题。此刻&#xff0c;Extreme Picture Finder如同一位贴心的向导&#xff0c;引领我们…

idea修改maven项目名称及子模块名称

一、修改目录名称 shift F6修改目录&#xff0c;选择“rename module and dictionary”。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/43efd9c6af6e43ad9656455db94b37a2.png)二、修改子项目pom的 三、修改父项目pom的 四、刷新maven项目

effective python学习笔记_pythonic思维

查py版本 import sys sys.version sys.version_info 遵循PEP8 PEP8,Python Enhancement Proposal #8 章节列了几个点&#xff0c;也可以看原文PEP 8 – Style Guide for Python Code | peps.python.org 导包顺序建议&#xff1a;先导标准库模块&#xff0c;再导三方模块&…