【算法专题】双指针算法

                          个人主页:CSDN_小八哥向前冲

                           所属专栏:基础算法


目录

移动零

复写零

快乐数

盛最多水的容器

有效三角形的个数

和为s的两个数

三数之和

四数之和


移动零

题目:【LeetCode】移动零

思路:

这里其实就是一个数组分块的问题,将数组分块即:前一个部分非零,而后一个部分为零。

定义双指针,一个指针(cur)遍历,另一个指针(dest)分割非零和零部分。

cur指针在遍历的过程中有两种情况,一是碰到零和碰到非零,当碰到零时,dest指针不变,cur指针前进一步,碰到非零时,dest前进一步(此时dest是指向零),再和cur指向交换,一直循环这个动作。

图:

代码:

class Solution {
public:void moveZeroes(vector<int>& nums) {int dest=-1;for(int cur=0;cur<nums.size();cur++){if(nums[cur]){swap(nums[++dest],nums[cur]);}}}
};

复写零

题目:【LeetCode】复写零

思路:

利用双指针,我们可以模拟一下从前到后去修改数组,但是发现会覆盖掉原数组的数!

所以,我们可以模拟一下从后到前去修改数组,发现可行!

图:

但是有一个特殊情况:

代码:

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;}if(dest>=n-1){break;}++cur;}//修正两指针的位置if(dest>=n){--cur;arr[n-1]=0;dest-=2;}//开始就地复写操作while(cur>=0){if(arr[cur]){arr[dest--]=arr[cur--];}else{arr[dest--]=0;arr[dest--]=0;--cur;}}}
};

快乐数

题目:【LeetCode】快乐数

题意分析:

思路:

我们可以将它们看成有环的链表,只需判断环内的数是不是1,还是其他数字。

定义快慢指针,快指针走两步,慢指针走一步,当进环后,快指针追上慢指针,判断此时是否为1就解决了!

代码:

class Solution {
public:int Happybit(int n){int sum=0;while(n){int t=n%10;sum+=t*t;n/=10;}return sum;}bool isHappy(int n) {int slow=n,fast=Happybit(n);while(slow!=fast){slow=Happybit(slow);fast=Happybit(Happybit(fast));}return fast==1;}
};

盛最多水的容器

题目:【LeetCode】盛水最多的容器

思路:

代码:

class Solution {
public:int maxArea(vector<int>& height) {int left=0,right=height.size()-1;//存较大容器的值int ret=0;while(left<right){//找出较大的值int v=min(height[left],height[right])*(right-left);ret=max(v,ret);//开始挪动if(height[left]<height[right]){left++;}else{right--;}}return ret;}
};

有效三角形的个数

题目:【LeetCode】有效三角形的个数

思路:

代码:

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());int n=nums.size(),sum=0;int key=n-1;//不断取最大的数while(key>=2){int left=0,right=key-1;//每趟while(left<right){if(nums[left]+nums[right]>nums[key]){sum+=right-left;right--;}else{left++;}}key--;}return sum;}
};

和为s的两个数

题目:【牛客】和为s的两个数

思路:

显然,时间太长了,不符合题目要求。

三数之和

题目:【LeetCode】三数之和

思路:

代码:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> vv;sort(nums.begin(),nums.end());int n=nums.size();for(int key=0;key<n;){//当key本身就是大于0的话,那么三数就一定不可能为0if(nums[key]>0) break;int left=key+1,right=n-1;while(left<right){int sum=nums[left]+nums[right];int targrt=-nums[key];if(sum<targrt) left++;else if(sum>targrt) right--;else{vv.push_back({nums[key],nums[left],nums[right]});left++;right--;//去除重复数据,小心越界while(left<right&&nums[left]==nums[left-1]) left++;while(left<right&&nums[right]==nums[right+1]) right--;}}//去重keykey++;while(key<n&&nums[key]==nums[key-1]) key++;}return vv;}
};

四数之和

题目:【LeetCode】四数之和

思路:

代码:

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(),nums.end());vector<vector<int>> vv;int n=nums.size();for(int key1=0;key1<n;){for(int key2=key1+1;key2<n;){int left=key2+1,right=n-1;while(left<right){int sum=nums[left]+nums[right];long long tmp=(long long)target-nums[key1]-nums[key2];if(sum<tmp) left++;else if(sum>tmp) right--;else{vv.push_back({nums[key1],nums[key2],nums[left],nums[right]});left++;right--;//将数据去重,注意越界情况while(left<right&&nums[left]==nums[left-1]) left++;while(left<right&&nums[right]==nums[right+1]) right--;}}//将key2去重key2++;while(key2<n&&nums[key2]==nums[key2-1]) key2++;}//将key1去重key1++;while(key1<n&&nums[key1]==nums[key1-1]) key1++;}return vv;}
};

这些就是双指针类型常见题目,我们下期见!

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

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

相关文章

机器学习:逻辑回归--下采样

目录 前言 一、为什么使用下采样 1.例如&#xff1a; 2.导致&#xff1a; 3.办法&#xff1a; 4.结果&#xff1a; 二、代码实现 1.完整代码 2.导入库 3.可视化混淆矩阵 4.导入数据 5数据预处理 6.下采样 7.取出训练集和测试集 8.建立模型 9.进行测试 总结 前…

代码签名证书:软件安全的守护者

在数字化时代&#xff0c;软件的安全性和用户信任度成为了不可忽视的关键因素。为了确保软件的真实性和完整性&#xff0c;代码签名证书&#xff08;Code Signing Certificate&#xff09;应运而生&#xff0c;成为开发者不可或缺的工具。 什么是代码签名证书&#xff1f; 代…

Vue 3 的 emit 简单使用

在 Vue 3 中使用 emit&#xff0c;子组件可以将事件通知父组件&#xff0c;父组件可以在响应这些事件时执行特定的逻辑。 emit 是一种非常灵活的通信方式&#xff0c;允许组件之间以解耦的方式进行交互。 1. 基本用法 1、使用 defineEmits 子组件 <template><div…

Spring之@Bean注解

1. 使用方式 1.1 Configuration Bean 1.1.1 创建实体类 User Data NoArgsConstructor public class User {private String name;public User(String name) {this.name name;} } 1.1.2 创建配置类 UserConfig Configuration public class UserConfig {Beanpublic User us…

数据结构中的双向链表

1.链表的分类 链表的结构非常多样&#xff0c;以下情况组合起来就是8种&#xff08;2x2x2&#xff09;链表结构&#xff1a; 在带头链表中&#xff0c;除了头结点&#xff0c;其他结点均存储有效的数据。 头结点是占位子的&#xff0c;也叫做“哨兵位”。head结点就是头结点。…

PPT如何添加水印?推荐两种方法!

在PPT演示文稿中添加水印&#xff0c;可以有效地保护版权或在背景上增加品牌标识。本文将介绍两种在PPT中添加水印的方法&#xff0c;帮助你轻松实现这一功能&#xff0c;一起来看看吧&#xff01; 方法一&#xff1a;在单张幻灯片上添加水印 1、选择目标幻灯片 打开PPT文件&…

『深度长文』4种有效提高LLM输出质量的方法!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之路不迷路,2024我们一起变强。 LLM,全…

docker 安装minio并配置https域名访问

一、准备目录 mkdir -p /home/minio/data/home/minio/config/home/minio/config/certs/二、下载域名证书&#xff0c;注意要Apache的 注意.key的换成 private.key&#xff0c;public.crt换成 public.crt&#xff0c;然后将这两个文件放到/home/minio/config/certs/目录下 三、…

贪心算法在背包问题上的运用(Python)

背包问题 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 这就是典型的背包问题(又称为0-1背包问题),也是具体的、没有经过任何延伸的背包问题模型。 背包问题的传统求解方法较为复杂,现定义有一个可以载重为8kg的背…

JNA调用DLL报堆栈溢出错误(0xC00000FD)

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

C++观察者模式Observer

组件协作 –(都是晚绑定的&#xff09; ----观察者模式 为某些对象建立一种通知依赖的关系&#xff0c; 只要这个对象状态发生改变&#xff0c;观察者对象都能得到通知。 但是依赖关系要松耦合&#xff0c;不要太依赖。 eg&#xff1a;做一个文件分割器&#xff0c;需要一个…

React学习笔记(一)——react基础

1. React 介绍 1.1 React是什么 React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 1.2 React的优势 相较于传统基于DOM开发的优势&#xff1a; 组件化的开发方式不错的性能 相较于其它前端框架的优势&#xff1a; 丰富的生态跨平台支持 1.3 React的市场…

基于MATLAB视觉的静态手势识别系统

一、课题介绍及思路 为了丰富手势识别方法的多样性&#xff0c;提高手势识别的正确率&#xff0c;提出了一种基于手势轮廓像素变化的手势识别方法。在Matlab环境下&#xff0c;设计并开发了一个基于视觉的静态手势识别系统。系统主要由两部分组成&#xff1a;手势分割与手势识…

数据科学已死?

既然有了人工智能&#xff0c;训练自己的机器学习模型是否还值得&#xff1f; 既然有了人工智能&#xff0c;学习 Python 是否还值得&#xff1f; 既然有了人工智能&#xff0c;KNIME 还在营业吗&#xff1f; 既然有了人工智能&#xff0c;数据科学是否仍然需要&#xff1f;…

指挥调度平台——数字赋能,让出行更有温度

智慧交通指挥调度平台是基于信息技术和智能化系统的创新解决方案&#xff0c;旨在提升城市交通管理效率、改善交通流畅度、减少拥堵问题&#xff0c;以及增强城市交通运行的智能化水平。该平台整合了大数据分析、实时监测、智能优化算法等技术&#xff0c;为交通管理部门提供全…

牛!6个大模型的核心技术!

大家好&#xff0c;我是花哥。本文我们谈下火爆的大模型背后&#xff0c;有哪些的核心技术&#xff01; 一、Transformer Transformer 是大模型的底层模型。在深度学习的早期阶段&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理序列数据的常用方法。尽管RNN及其变…

1.XV6环境配置

安装虚拟机 这个就不多说了&#xff0c;搞一台Ubuntu虚拟机即可&#xff0c;最好是通过vscode 用ssh远程连接进行实验会比较方便&#xff0c;具体怎么做可参考我这篇博客&#xff1a; VsCode配置SSH连接远程服务器&#xff08;手把手&#xff0c;学不会打我&#xff09;_vsco…

【GitLab】使用 Docker 安装 GitLab 1:配置 SSH 端口

使用 Docker 安装 GitLab 要求修改ssh端口 GitLab 使用 SSH 通过 SSH 与 Git 交互。默认情况下,GitLab 使用端口22。 要在使用 GitLab Docker 映像时使用其他端口,您可以执行以下操作之一: 更改服务器的 SSH 端口(推荐)。 更改 GitLab Shell SSH 端口。 更改服务器的 SSH …

数据链路层 III(介质访问控制)【★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 介质访问控制所要完成的主要任务是&#xff1a;为使用介质的每个结点隔离来自同一信道上其他结点所传送的信号&#xff0c;以协调活动结点的传输。 下图所示是广播…

ubuntu安装虚拟环境(tensorflow、torch)

一、安装需求 1、确保ubuntu可以ping通百度 2、设置好了pip镜像源&#xff0c;&#xff08;具体可看&#xff1a;ubuntu配pip的源-CSDN博客&#xff09; 二、安装虚拟环境&#xff08;务必使用sudo进行&#xff09; step1&#xff1a;执行安装命令 更改了pip默认使用pip3的…