走进算法大门---双指针问题(一)

news2024/11/25 5:33:06

一.双指针算法介绍

概念:双指针是指在遍历数据结构(如数组、链表等)时使用两个指针,通过特定的移动规则来解决问题。这两个指针可以同向移动,也可以相向移动。

  • 同向双指针:常用于解决需要两个位置信息的问题。例如,在一个有序数组中查找两个数的和等于目标值的情况。一个指针从数组头部开始,另一个指针从当前指针的后面开始,通过不断调整指针位置来找到符合条件的数对。
  • 相向双指针:典型应用是在排序数组中查找满足某种条件的子数组。比如,在一个递增的数组中,一个指针从数组开头,一个指针从数组末尾,根据两个指针所指元素的和、差等关系,向中间移动指针,直到满足特定条件。
  • 优势:双指针算法可以降低时间复杂度,将原本需要嵌套循环的问题简化为单循环或更高效的遍历方式。例如,在某些情况下,可以将时间复杂度从n^2 降低到n 。

二.移动0

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

class Solution {
    public void moveZeroes(int[] nums) {
        for(int cur = 0,dest = -1;cur<nums.length;cur++){
            if(nums[cur]!=0){
                dest++;
                int tmp = nums[cur];
                nums[cur]=nums[dest];
                nums[dest] =tmp;
            }
        }
       
    }
}

在这里插入图片描述

解题思路:主要把数组分为3个区间,已经处理过的非0区间,0元素区间和未处理的区间。

把数组分为3部分:

  • [0,dest] :处理过的非0元素
  • [dest+1,cur-1] 处理过的0元素
  • [cur,arry,length-1] 未被处理的元素

在这里插入图片描述

初始化时让cur 指向0元素位置,dest指向-1。刚开始所有元素都未处理,按照划分区间,未被处理的元素区间为【0,dest】,所以dest不能等于0,等于0说明第一个元素已经被处理过,边界不好区分,因此让dest=-1。
在这里插入图片描述

当cur的值等于0时,cur++;cur的值不等于0,让dest先走一步接着dest和cur 对应元素的值互相交换,每次都能保证数组的3个范围的划分。
在这里插入图片描述

在代码执行中,非零元素会依次覆盖零元素的位置,最终达到将所有零移动到数组末尾的目的。此方法的时间复杂度为 O(n),空间复杂度为 O(1),即为原地操作,不占用额外空间。如果暴力求解时间复杂度n方,双指针确实比暴力求解时间复杂度低。

三.快乐数

快乐数
在这里插入图片描述

class Solution {
    public int Num(int n) {
        int sum = 0;
        while (n!= 0) {
            int t = n % 10;
            sum += t * t;
            n /= 10;
        }
        return sum;
    }

    public boolean isHappy(int n) {
        int slow = n;
        int fast = Num(n);
        while (fast!= slow) {
            slow = Num(slow);
            fast = Num(Num(fast));
        }
        return slow == 1;
    }
}

解法:前面学习链表的时候我们学过判断链表是否带环,让快指针一次走2步,慢指针一次走一步,如果存在环它们总能相遇。

以19为例是该树快乐数,通过对19的运算结果确实是1,说明是快乐数。
在这里插入图片描述

以2为例判断不是快乐数。4和20形成了一个环,说明不是快乐数。
在这里插入图片描述
把这个环想象成链表带环,让快指针在环里面一次走2步,慢指针一次走一步总会在环里面的某个位置相遇,相遇后跳出循环判断相遇点的值是否为1,如果是1说明是快乐数,不是1说明不是。

关于是否会陷入死循环
在这个算法中,实际上是利用了快慢指针的思想。对于一个正整数,如果它不是快乐数,那么在不断计算各位数字平方和的过程中,最终会陷入一个循环。
由于数字的范围是有限的(对于给定的正整数,经过有限次的数字平方和计算后,得到的结果一定在一个有限的范围内)。
假设存在一个非快乐数,在计算过程中会进入一个循环,那么快慢指针一定会在这个循环中相遇。因为快指针每次移动两步,慢指针每次移动一步,在一个有限的循环中,快指针必然会追上慢指针。
如果这个数是快乐数,那么最终会得到1,此时快慢指针也会相等(因为最终都会到达1这个结果)。

四.盛最多容器的水

盛最多容器的水
在这里插入图片描述
在这里插入图片描述

class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int v = 0;
        while (left < right) {
            int min = Math.min(height[left], height[right]);
            v = Math.max(v, min*(right - left));
            if (height[right] > height[left]) {
                left++;
            } else {
                right--;
            }
        }
        return v;
    }
}

在这里插入图片描述

解法:如果本题暴力求解去枚举算最大值比较大小,那么时间复杂度太高。

简单方法是去掉一些没必要的值。举个例子:算8和5的容积。该容器高度是5,宽度为(right-left)=6。因此v=5*6=30。

在这里插入图片描述
接着枚举该数组v的最大值那么宽度必然是减少的,因为求下一个容积会让left++,或者right–,那么(right-left)的值必然减少。因此宽度会减少。
在这里插入图片描述

对于v=宽度*高度,宽度减少要想体积增大必须高度增加。8和5的最小值是5,要想高度增加,那么right的值必然要大于5,所以可以看做舍弃5,让right减减。计算容器8和9容积
在这里插入图片描述

v=5*8=40,v上次的值是30,40大于30,所以v的值更新为40。求下一个容积也是同样的做法,要想v在宽度减少的情况下增大,那么高度的最小值一定要增大,也就是比较left和right的对应值的最小值,把这个最小值舍弃掉,在去求v。每次比较和上次v值的大小看是否更新v的值。
在这里插入图片描述

这道题考察了如何通过合理的指针移动来减少不必要的计算,双指针法的精髓在于每次有目的地舍弃一些不可能产生最大值的组合,从而将时间复杂度降至线性。在实际解题时,双指针法是一种非常高效的解法,特别适用于涉及到对区间或边界的遍历优化问题。

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

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

相关文章

用 Python 从零开始创建神经网络(一)

用 Python 从零开始创建神经网络&#xff08;一&#xff09; 引言1. A Single Neuron&#xff1a;Example 1代码部分&#xff1a; Example 2代码部分&#xff1a; 2. A Layer of Neurons&#xff1a;Example 1代码部分&#xff1a; 引言 本教程专为那些对神经网络已有基础了解…

深度学习⑨GANs

Discriminative and Generative Models Deep learning中主要两种模型 判别模型专注于从输入预测输出,例如分类任务。学习数据点和标签之间的特征 生成模型则试图理解数据是如何产生的,能够生成新的数据样本。理解数据分布和是否可以被预测 Quiz time: Discriminative mo…

[产品管理-58]:安索夫矩阵矩阵帮助创业者确定研发出来的产品在市场中定位策略

目录 一、提出背景 二、核心思想与结构 三、应用背景与领域 四、实践案例 安索夫矩阵&#xff08;Ansoff Matrix&#xff09;&#xff0c;也被称为产品/市场方格或成长矢量矩阵&#xff0c;其应用背景可以从以下几个方面进行详细阐述&#xff1a; 一、提出背景 安索夫矩阵…

物联网对商业领域的影响

互联网彻底改变了通信方式&#xff0c;并跨越了因地理障碍造成的人与人之间的鸿沟。然而&#xff0c;物联网&#xff08;IoT&#xff09;的引入通过使设备能够连接到互联网&#xff0c;改变了设备的功能。想象一下&#xff0c;你的闹钟连接到互联网&#xff0c;并且能够用你的声…

微信小程序——用户隐私保护指引填写(详细版)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

LED点阵显示(Proteus 与Keil uVision联合仿真)(点阵字模提取)

点阵字模提取&#xff1a; https://pan.baidu.com/s/1DZSeLyD_SUkaHRgTm26o-A 提取码: 1111 一、LED点阵显示器结构 点亮点阵中一个发光二极管条件&#xff1a;对应行为高电平&#xff0c;对应列为低电平。如在很短时间内依次点亮很多个发光二极管&#xff0c;LED点阵就可显示…

JDBC学习记录

文章目录 一、JDBC简介1.1、 JDBC概念1.2、 JDBC本质1.3、 JDBC好处 二、JDBC快速入门2.1、 编写代码步骤2.2、 代码示例 三、JDBC API详解3.1、DriverManager3.1.1、注册驱动3.1.2、获取连接 3.2、Connection3.2.1、获取执行对象3.2.2、事务管理 3.3、Statement3.3.1、执行DDL…

[Linux] 进程等待 | 进程替换

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 我有一个朋友&#x…

运用Agent搭建“狼人杀”游戏服务器端!

背景 从23年开年以来&#xff0c;大模型引爆了各行各业。去年比较出圈的是各类文生图的应用&#xff0c;比如Stable Diffusion。网上可以看到各类解释其背后的原理和应用的文章。另外一条平行线&#xff0c;则是文生文的场景。受限于当时LLM&#xff08;大语言模型&#xff09…

笔记分享 |【黑马Pink老师】Web APIs

Web API 基本认知 介绍 严格意义上讲&#xff0c;我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系&#xff1b; ECMAScript 简称 ES 它提供了一套语言标准规范&#xff0c;如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的&am…

Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin

Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin import android.graphics.Bitmap import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.Glide import …

大数据学习10之Hive高级

1.Hive高级 将大的文件按照某一列属性进行GROUP BY 就是分区&#xff0c;只是默认开窗存储&#xff1b; 分区是按行&#xff0c;如一百行数据&#xff0c;按十位上的数字分区&#xff0c;则有十个分区&#xff0c;每个分区里有十行&#xff1b; 分桶是根据某个字段哈希对桶数取…

嵌入式新手必读好文,常见传感器类型中,LM393的作用,及模块原理(看不懂来问我)!!!

目录 序言 常感器基本知识 常见传感器原理 D0引脚的作用 如何设置电位器 欢迎指正&#xff0c;希望对你&#xff0c;有所帮助&#xff0c;禁止搬运&#xff01;&#xff01;&#xff01; 前言&#xff1a;编写不易&#xff0c;请问搬运&#xff0c;仅供学习&#xff0c;有…

机器学习2_支持向量机_线性可分——MOOC

目录 定义 线性可分&#xff08;Linear Separable&#xff09; 线性不可分&#xff08;Nonlinear Separable&#xff09; 数学化定义 问题描述 优化问题 线性可分定义 假定训练样本集是线性可分的 1、最小化&#xff08;Minimize&#xff09;&#xff1a; 2、限制条件…

git 工具原理

git 目录 git git的使用 了解git的三个区域 具体操作 如何下载别人上传到git的工程 -- 可以参考菜鸟教程&#xff0c;包括安装配置git Git 安装配置 | 菜鸟教程 -- Git 是一种分布式版本控制系统&#xff0c;用于管理软件项目的源代码。它是由 Linux 之父 Linus Torval…

MAN TruckScenes数据集:第一个用于自动驾驶卡车的大规模多模式数据集。

2024-07-15,为了推进自动驾驶卡车技术的发展并确保其在公共道路上的安全性&#xff0c;由慕尼黑工业大学和MAN Truck & Bus SE联合创建了MAN TruckScenes数据集。数据集首次为研究社区提供了一个包含丰富环境条件下的卡车特定挑战&#xff0c;如拖车遮挡、新型传感器视角和…

基于微信小程序的实习管理系统(附源码,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

mp3格式音频怎么做成二维码?扫码获取音频文件的制作方法

随着二维码的广泛使用&#xff0c;现在很多内容都会通过生成二维码的方式来传输内容&#xff0c;通过这种方式可以更快捷的实现内容分享&#xff0c;简化其他人获取内容的流程&#xff0c;有效提高效率。音频是目前常见的一种内容分享方式&#xff0c;比如录音、听力、音乐等类…

山东布谷科技:关于直播源码|语音源码|一对一直播源码提交App Store的流程及重构建议

自从YY、六间房开启国内聊天室和秀场等网红盛行的网络红利时代以来&#xff0c;紧随其后国内各大音视频平台相应出现&#xff0c;先有映客花椒等直播平台的风头正劲&#xff0c;后有功能板块更丰富的头条抖音Tiktok等&#xff0c;盈利功能点不仅仅有直播PK连麦等礼物打赏功能&a…

【NOIP普及组】统计单词数

【NOIP普及组】统计单词数 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 一般的文本编辑器都有查找单词的功能&#xff0c;该功能可以快速定位特定单词在文章中的位置&#xff0c;有的还能统计出特定单词在文章中出现的次数。 现在&#x…