【算法】双指针

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

双指针算法习题目录

  • 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,一经查实,立即删除!

相关文章

大宋咨询消费者需求研究问卷如何设计

设计消费者需求研究问卷需要考虑清楚研究目标、问题和目标受众的特点。一个良好的问卷设计能够确保收集到准确、有用的消费者反馈。以下大宋咨询是设计消费者需求研究问卷的一些建议&#xff1a; 1. 确定研究目标和问题&#xff1a; 在设计问卷之前&#xff0c;明确你希望从问…

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

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

Java Solon v2.7.6 发布

Java Solon 是什么框架&#xff1f; Java “新的”应用开发框架。开放原子开源基金会&#xff0c;孵化项目。从零开始构建&#xff08;非 java-ee 架构&#xff09;&#xff0c;有灵活的接口规范与开放生态。 追求&#xff1a; 更快、更小、更简单提倡&#xff1a; 克制、简洁…

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

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

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

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

基于Spring EL表达式处理业务表达式

文章目录 简介Spring EL的常见应用Value处理注解xml中使用 Spring EL表达式基本表达式模板函数表达式 Spring EL定制引用Spring的bean 简介 SpringEL是Spring表达式&#xff0c;功能非常强大。 我们可以能在Value、Cachable、自定义注解中的应用EL表达式&#xff0c;当然这些…

子集II(力扣90)

解题思路&#xff1a;used判断是否出现过&#xff0c;然后遍历就好了 具体代码如下&#xff1a; class Solution { public: vector<vector<int>>result; vector<int>path; void travelBack(vector<int>&nums,int startIndex,vector <bool&…

内容安全(DPI和DFI解析)

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

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

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

Java作业8-泛型和模板类

编程1 题目 自定义堆栈类 用泛型数组实现自定义堆栈类GenericStack&#xff0c;可处理任意类型数据。 堆栈类中包含三个成员&#xff0c;一为泛型类型数组list&#xff0c;保存栈中元素&#xff0c;一为整型成员length表示数组的长度&#xff0c;一为整型成员count表示当前…

SRC公益漏洞挖掘思路分享

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

LeetCode 每日一题 ---- 【741.摘樱桃】

LeetCode 每日一题 ---- 【741.摘樱桃】 741.摘樱桃方法&#xff1a;动态规划 741.摘樱桃 方法&#xff1a;动态规划 这是一道动态规划的题目&#xff0c;enmmmm&#xff0c;依旧是做不出来&#xff0c;尤其是看到困难两个标红的字体&#xff0c;就更不想做了&#xff0c;然后…

一起深度学习(AlexNet网络)

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

【算法刷题day41】Leetcode:343. 整数拆分、96. 不同的二叉搜索树

文章目录 Leetcode 343. 整数拆分解题思路代码总结 Leetcode 96. 不同的二叉搜索树解题思路代码总结 草稿图网站 java的Deque Leetcode 343. 整数拆分 题目&#xff1a;343. 整数拆分 解析&#xff1a;代码随想录解析 解题思路 通过两轮循环&#xff0c;分别找到每个数的最大…

FineReport高频面试题及参考答案

FineReport是一款利用什么语言开发的报表工具&#xff1f; FineReport是一款基于Java语言开发的报表工具。Java是一种广泛使用的编程语言&#xff0c;特别适合于跨平台的软件开发。FineReport利用Java语言的诸多优势&#xff0c;如稳定性、安全性、可移植性和强大的网络功能&a…

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.环形链表就是一个这样的题目。 这里的思路是用快慢指…

B3966 [语言月赛 202404] 道法考试

题目背景 你正在参加一场道法考试。这次的道法考试题目全部都是问答题。 题目描述 有 n 道题目&#xff0c;每道题标准答案都是 m 个整数&#xff0c;代表答案包含的知识点的编号。 而你对于第 i&#xff08;1≤i≤n&#xff09;道题的作答是 li​ 个整数&#xff0c;代表作…