【算法】双指针算法

个人主页 : zxctscl
如有转载请先通知

题目

  • 1. 283. 移动零
    • 1.1 分析
    • 1.2 代码
  • 2. 1089. 复写零
    • 2.1 分析
    • 2.2 代码
  • 3. 202. 快乐数
    • 3.1 分析
    • 3.2 代码
  • 4. 11. 盛最多水的容器
    • 4.1 分析
    • 4.2 代码
  • 5. LCR 179. 查找总价格为目标值的两个商品
    • 5.1 分析
    • 5.2 代码
  • 6. 15. 三数之和
    • 6.1 分析
    • 6.2 代码

1. 283. 移动零

在这里插入图片描述

1.1 分析

一、题目分析
要将0放在所有数组的最后,而且非零元素的顺序保持不变,要求原地对数组进行移动。

二、算法原理
用两个指针来讲数组进行划分,一个cur:从左往右扫描数组,遍历数组;一个dest:已经处理的区间内,非零元素的最后一个位置。
就将数组分为3个区间:非零:[0,dest];0区间:[dest+1,cur-1];待处理的区间:[cur,n-1].
要想这样划分,cur就得从前往后在遍历的过程中,遇到0元素,就加加;遇到非零元素,就将dest+1位置和cur位置的值交换。
在这里插入图片描述

在这里插入图片描述

1.2 代码

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

    }
};

2. 1089. 复写零

在这里插入图片描述

2.1 分析

一、题目解析
要求每次遇到0就复写,而且不能改变原数组的长度。

二、算法原理
如果用双指针从前往后遍历,就拿例1来说,
就会出现值被覆盖的情况:
在这里插入图片描述
所以遍历顺序就不能从前往后。
那么就把顺序改为从后往前遍历,但是不能超过原数组的长度,就得先找一下cur和dest开始的位置。
可以先用双指针算法:1.先判断cur位置;2.决定dest向后移动一步或者两步;3.判断一下dest是否已经到达结束位置;4.在把cur加加。
但是可能会出现dest越界的情况,如果n-1位置为0,那么cur就减减,dest就减2。
最后在从后往前开始复写0。

在这里插入图片描述

2.2 代码

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
    int cur=0,dest=-1;
    int n=arr.size();
    while(cur<n)
    {
        if(arr[cur])dest++;
        else dest+=2;
        if(dest>=n-1)break;
        cur++;
    }
    if(dest==n)
    {
        arr[n-1]=0;
        cur--;
        dest-=2;
    }

    while(cur>=0)
    {
        if(arr[cur])arr[dest--]=arr[cur--];
        else 
        {
            arr[dest--]=0;
            arr[dest--]=0;
             cur--;
        }
    }
    }
};

3. 202. 快乐数

在这里插入图片描述

3.1 分析

一、题目分析
题目中所说最后的平方和为1才是快乐数,如果不为1,就一直循环,其实可以看成两个都是循环,一个一直循环的是1,另一个循环的值都不相同。只需要判断循环里面的值是不是为1就可以。

二、算法原理
先用一个变量sum记录最后平方和,然后把最后一位平方,然后删掉原来的数,一直重复这个过程,直到最后一位为0,最后返回这个平方和sum。

定义两个快慢指针,用平方和来充当指针,slow指向第一个数,fast指向第二个数,如果这两个指针一直不相等,就一直循环,slow走一步,fast走两步。直到两个相遇为止,等于1就是快乐数,不等于就不是。
在这里插入图片描述

3.2 代码

class Solution {
public:
    int bitsum(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=bitsum(n);
      while(slow!=fast)
      {
        slow=bitsum(slow);
        fast=bitsum(bitsum(fast));
      }
      return slow==1;
    }
};

4. 11. 盛最多水的容器

在这里插入图片描述

4.1 分析

一、题目分析
题目中的数组代表每一条线的高度,来求最大的容积,来看一下例1:
在这里插入图片描述
选择的高度是8和7,但是题目要求不能倾斜,这里选择高度的就是7,宽度就是下标之间的差值8-1也就是7,那么容积最大就是7*7=49。

二、算法原理
用两个指针来记录容器两边的高度,可以直接先选择最大的宽度,记录下这个容积。
如果左边指针走一步,宽度在减小,高度可能会出现比之前的小,那么体积就比原来的小;高度如果不变,那么宽度减小,那么总容积也是在减小的。所以得干掉高度小的那一个值。
如果两个指针指向的值相等,那么干掉谁都可以,然后继续枚举里面相乘的容积,直到两个指针相遇,最后返回容积最大的值就行。
在这里插入图片描述

4.2 代码

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

5. LCR 179. 查找总价格为目标值的两个商品

在这里插入图片描述

5.1 分析

一、题目分析
只需要找到两个数,他们的和等于目标值就可以,但是题目中的数组是按照升序排列的,暴力解法会超时,就不考虑了。

二、算法原理
利用数组是有序的,用双指针算法来算。
定义两个指针,一个在左边,一个在右边。
先计算两个指针指向值的和,判断一下和目标值的大小,会出现三种情况:1.小于目标值,那么左边指针就加加;2.等于就返回这两个值;3.大于目标值,那么右边指针就减减。
在这里插入图片描述

5.2 代码

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
    int left=0,right=price.size()-1,sum=0;
    while(left<right)
    {
        sum=price[left]+price[right];
        if(sum<target)left++;
        else if(sum>target)right--;
        else return{price[left],price[right]};
    }
    return {-1,-1};
    }
};

6. 15. 三数之和

在这里插入图片描述

6.1 分析

一、题目分析
题目要求返回三元数组和为1的三个不同的数,而且要求去重,来看一下例1:
它里面有[-1,0,1]、[0,1,-1]、[-1,2,-1],但是第一组和第二组的元素是相同的,就只能返回一个。
在这里插入图片描述
为了避免去重,可以先给数组排个序。

二、算法原理
排序之后,数据是有序的,这里就用双指针算法。
这里是三个数的和,可以先固定一个数a,仅想要保证这个a是小于0就行(在后面等于0相加的值不可能等于0),然后在该数后面的区间内,利用双指针算法,快速找到两个数的和,者两个数的和是a的相反数,这样这三个数相加的时候,值就为0。
这里还有可能不止一种情况,所以不要漏掉,在找到一种情况时候,左边指针和右边指针继续缩小区间找,直到两个指针相同。
那么怎么去重,已经是有序的数组,那么连续相同值的情况就不考虑了,就是在左边指针和右边指针已经找到值,就跳过重复的值。当使用完重复的元素时候,固定值也得跳过重复值。还得避免越界的情况。
在这里插入图片描述

6.2 代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());

        vector<vector<int>> ret;
        int n=nums.size();
        for(int i=0;i<n;)
        {
          if(nums[i]>0)break;
          int left=i+1,right=n-1,target=-nums[i];

            while(left<right)
            {
                int sum=nums[left]+nums[right];
                 if(sum<target) left++;
                 else if(sum>target)right--;
                 else
                 {
                    ret.push_back({nums[i],nums[left],nums[right]});
                    left++;right--;
                    while(left<right&&nums[left]==nums[left-1])left++;
                     while(left<right&&nums[right]==nums[right+1])right--;
                    }

            }
            i++;
            while(i<n&&nums[i]==nums[i-1])i++;

        }
        return ret;

    }
};

有问题请指出,大家一起进步!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【攻防世界】web2(逆向解密)

进入题目环境&#xff0c;查看页面信息&#xff1a; <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){$_ostrrev($str);// echo $_o;for($_00;$_0<strlen($_o);$_0){$_csubstr($_o,$_0,1);$__ord($_c)1;…

2014最新AI智能系统ChatGPT网站源码GPTs应用支持+Ai绘画网站源码+搭建部署教程文档

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

深度解析SPARK的基本概念

关联阅读博客文章&#xff1a; 深入理解MapReduce&#xff1a;从Map到Reduce的工作原理解析 引言&#xff1a; 在当今大数据时代&#xff0c;数据处理和分析成为了企业发展的重要驱动力。Apache Spark作为一个快速、通用的大数据处理引擎&#xff0c;受到了广泛的关注和应用。…

打造个性化聊天机器人:用Ollama和Open WebUI搭建你的私有ChatGPT!

一 简介 Ollama 官网&#xff1a;https://github.com/ollama/ollama Ollama是一个开源的人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;工具平台&#xff0c;特别设计用于简化大型语言模型&#xff08;LLM&#xff09;的部署和使用流程。用户可以通…

nginx工作原理解析

目录 1、master-workers 的工作机制介绍 2、master-workers 的机制的好处 3、设置多少个 worker 4、最大连接数和支持的最大并发数的计算 1、master-workers 的工作机制介绍 nginx在启动后&#xff0c;会有一个master进程和一个或者多个相互独立的worker进程 过来的请求由…

4个关键提示:打造符合规范的网页设计

网页设计也属于UI设计的范畴&#xff0c;是近年来的热门话题。随着互联网时代的到来&#xff0c;越来越多的企业开始关注网页UI设计。正因为如此&#xff0c;UI设计可以说是目前设计行业薪酬最高的存在。 那么&#xff0c;对于目前学习网页设计的小伙伴来说&#xff0c;如何才…

电脑远程控制esp32上的LED

1、思路整理 首先esp32需要连接上wifi 然后创建udp socket 接受udp数据 最后解析数据&#xff0c;控制LED 2、micropython代码实现 import network from socket import * from machine import Pin p2Pin(2,Pin.OUT)def do_connect(): #连接wifi wlan network.WLAN(network.…

SpringBoot项目如何国际化操作,让你可以随意切换语言

1.前言 最近接触的项目需要中文/英文或者其他国家语言的切换&#xff0c;在后台的时候有一个选择&#xff0c;你可以选择中文还是英文&#xff0c;或者其他语言&#xff0c;选择完毕界面语言就都变了&#xff0c;咱不知道前端怎么操作的&#xff0c;但是后台在处理提示语的时候…

Qt/C++推流组件使用说明

2.1 网络推流 公众号&#xff1a;Qt实战&#xff0c;各种开源作品、经验整理、项目实战技巧&#xff0c;专注Qt/C软件开发&#xff0c;视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。 公众号&#xff1a;Qt入门和进阶&#xff0c;专门介绍Qt/C相关知识点学…

ppt从零基础到高手【办公】

第一章&#xff1a;文字排版篇01演示文稿内容基密02文字操作规范03文字排版处理04复习&作业解析第二章&#xff1a;图形图片图表篇05图形化表达06图片艺术化07轻松玩转图表08高效工具&母版统一管理09复习&作业解析10轻松一刻-文字图形小技巧速学第三章&#xff1a;…

[dvwa] xss dom

xss dom 0x01 low <script>alert(document.cookie)</script>弹个窗 script被写入html 0x02 medium 过滤<script 考虑使用img标签&#xff0c;其onerror属性在该元素加载src错误时触发 注入元素被写入value&#xff0c;就在value闭合option 和 select标签…

DP:子数组模型

一、最大子数组和 . - 力扣&#xff08;LeetCode&#xff09; 二、环形子数组的最大和 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxSubarraySumCircular(vector<int>& nums) {//动态规划思想解决 //环形数组问题&#xff0c;尝试转…

SpringBoot之SpringBoot整合MyBatis

本章详情 使用SpringBoot和MyBatis通过注解的方式操作数据库使用SpringBoot和MyBatis通过XML配置文件的方式操作数据库 项目搭建 1. 打开idea,选择Create New Project 2.选择Spring Initializer,然后点击Next 3.填写组织&#xff0c;坐标等信息&#xff0c;然后点击Next 4.选…

Qt | QObject 类中的成员函数存取属性值与动态属性、用反射机制获取属性的信息

1、注册自定义类型与 QMetaType 类 ①、QMetaType 类用于管理元对象系统中命名的类型,该类用于帮助 QVariant 中的类型以及队列中信号和槽的连接。它将类型名称与类型关联,以便在运行时动态创建和销毁该名称。 ②、QMetaType::Type 枚举类型定义了 QMetaType 支持的类型。其…

婴儿专用洗衣机有必要吗?精选4款品质婴儿洗衣机疯狂安利!

宝宝衣服的清洗对父母来说都很重要&#xff0c;所以挑选一款适合宝宝的小型洗衣机显得尤为重要。也许有许多人认为&#xff0c;为婴儿购买独立的洗衣机是不必要的&#xff0c;但是你是否了解呢&#xff1f;新生婴儿的肌肤要比成人更脆弱&#xff0c;更易受到感染而受到伤害&…

无人零售革新购物体验

无人零售革新购物体验 在智能化技术不断进步的今天&#xff0c;无人零售作为一种整合了尖端科技的新型零售方式&#xff0c;正在快速转变我们的消费体验。这种零售模式&#xff0c;凭借其高效与便捷性&#xff0c;不仅极大地丰富了消费者的购物方式&#xff0c;同时也为零售行…

xss.pwnfunction-Ah That‘s Hawt

<svg/onloadalert%26%2340%3B1%26%2341%3B> <svg/>是一个自闭合形式 &#xff0c;当页面或元素加载完成时&#xff0c;onload 事件会被触发&#xff0c;从而可以执行相应的 JavaScript 函数

flask 访问404

当你的项目有自己的蓝图&#xff0c;有添加自己的前缀&#xff0c;也注册了蓝图。 在访问的路由那里也使用了自己的蓝图&#xff0c;如下图 然后你访问的地址也没问题&#xff0c;但是不管怎么样访问就是返回404&#xff0c;这个时候不要怀疑你上面的哪里配置错误&#xff0c;…

JVM规范中的运行时数据区

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

[网鼎杯 2020 玄武组]SSRFMe-反弹shell

[网鼎杯 2020 玄武组]SSRFMe 因为用常规方法一直写不出来&#xff0c;所以就换了一种 反弹shell 参考文章 很经典的一道CTF-WriteUP[网鼎杯 2020 玄武组]SSRFMe - FreeBuf网络安全行业门户