首页 > 其他分享 >24届秋招专场 · 数组如何用双指针解题呢?

24届秋招专场 · 数组如何用双指针解题呢?

时间:2023-07-05 12:33:09浏览次数:53  
标签:24 slow nums ++ 届秋招 fast int 解题 移除


24届秋招专场 · 数组如何用双指针解题呢?_数据结构

你好,我是安然无虞。


文章目录

  • 删除有序数组中的重复项
  • 删除排序链表中的重复元素
  • 移除元素
  • 移除零


大家好,近期主要更新数组相关的解题算法咯,感兴趣的老铁可以一起看过来啦。

24届秋招专场 · 数组如何用双指针解题呢?_赋值_02


今天更新使用双指针解决数组部分题型,注意哦,这里所说的双指针不是C语言中“指针”的概念,指的是数组的索引下标,不要混淆咯。

话不多说,开始刷题!

删除有序数组中的重复项

题目链接:删除有序数组中的重复项 题目描述:

24届秋招专场 · 数组如何用双指针解题呢?_数据结构_03


24届秋招专场 · 数组如何用双指针解题呢?_算法_04


解题思路:

  • 定义快慢指针,slow走在后面,fast走在前面探路
  • fast找到不重复的元素就赋值给slow,并且slow++
  • PS:赋值和slow++的先后顺序请画图理解

代码详解:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) 
    {
        // 定义快慢指针,slow走在后面,fast走在前面探路
        // fast找到不重复的元素就赋值给slow,并且slow++
        // 需要注意赋值和slow++的先后顺序,需要画图去理解
        int slow = 0, fast = 0;

        while(fast < nums.size())
        {
            if(nums[slow] != nums[fast])
            {
                slow++; // slow++在先,后赋值
                nums[slow] = nums[fast];
            }

            fast++;
        }

        // 光看没用,请画图理解
        return slow + 1;
    }
};

理解了上面的数组题型,下面的链表就不难理解啦,只需要注意这里指针的指向即可。

删除排序链表中的重复元素

题目链接:删除排序链表中的重复元素 题目描述:

24届秋招专场 · 数组如何用双指针解题呢?_数据结构_05


解题思路:

仿照上面的解题思路即可,最后需要注意断开与后面重复元素的连接。

代码详解:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) 
    {
        if(head == nullptr)
            return nullptr;

        // 定义快慢指针
        ListNode* slow = head, *fast = head;

        while(fast != nullptr)
        {
            if(slow->val != fast->val)
            {
                slow->next = fast;
                slow = slow->next;
            }

            fast = fast->next;
        }

        // 注意需要断开与后面重复元素的连接
        slow->next = nullptr;

        return head;
    }
};

移除元素

题目链接:移除元素 题目描述:

24届秋招专场 · 数组如何用双指针解题呢?_算法_06


解题思路:

定义快慢指针,fast遇到值不为val的元素就赋值给slow,并且slow++,请注意赋值和slow++的先后顺序,需要画图理解。

代码详解:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        // 定义快慢指针
        // 如果fast遇到值不为val的元素则赋值给slow,并且slow++
        // 还是需要注意赋值和slow++的先后顺序,请画图理解
        int slow = 0, fast = 0;

        while(fast < nums.size())
        {
            if(nums[fast] != val)
            {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }

        return slow;
    }
};

移除零

题目链接:移除零 题目描述:

24届秋招专场 · 数组如何用双指针解题呢?_leetcode_07


解题思路:

  • 根据 移除元素 思路,将0全部移除,此时数组前面的元素都是非0数
  • 然后再将[p, nums.size()-1]全部置为0即可

代码详解:

class Solution {
public:
    void moveZeroes(vector<int>& nums) 
    {
        // 根据 移除元素 思路,将0全部移除
        // 然后再将[p, nums.size()-1]全部置为0即可
        int p = removeElement(nums, 0);

        for(int i = p; i < nums.size(); i++)
        {
            nums[i] = 0;
        }
    }

    // 移除元素
    int removeElement(vector<int>& nums, int val)
    {
        int slow = 0, fast = 0;

        while(fast < nums.size())
        {
            if(nums[fast] != val)
            {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }

        return slow;
    }
};

种一棵树最好的时间是十年前, 其次是现在.

一起加油, 下篇博客再会.


标签:24,slow,nums,++,届秋招,fast,int,解题,移除
From: https://blog.51cto.com/u_15495449/6630665

相关文章

  • 2023-03-24-CQ 2023 省选前考试记录
    Ihopeitwasenoughtobethewayyouarewheneverything'sfallingapart.2023-03-27我是......
  • 2023-03-24-CQ 2023 省选前复习记录
    伝えに来たよ傷跡を辿ってそれならもう恐れるものはないんだと.CF449D看来我确实只会做板题/kk。一个很naive的想法是定义\(dp_{i,x}\)表示当前到了第\(i\)位,与起来的值为\(x\)的方案数,显然这个做不下去,因为状态数会有重叠,并且这复杂度会爆。一个不那么naiv......
  • 算法学习day06哈希表part01-242、349、202、1
    packageSecondBrush.Hash;/***242.有效字母异位词*现在看到这个题目能想到怎么做,但是具体不知道怎么写*大致思路自己先描述一下:*就是建立一个hash表,然后遍历s,写进表中,遍历t,减去对应的数*hash表就可以理解为数组*/publicclassValidAnagram_242{publi......
  • 第014课 Jz2400_ARM异常与中断体系详解
    第001节_概念引入与处理流程取个场景解释中断。假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。问:这个母亲怎么才能知道这个小孩醒?过一会打开一次房门,看婴儿是否睡醒,让后接着看书一直等到婴儿发出声音以后再过去查看,期间都在读书第一种叫做查询方式:*优点:简单*缺......
  • 如何使用libswscale库将YUV420P格式的图像序列转换为RGB24格式输出?
    一.视频格式转换初始化将视频中的图像帧按照一定比例缩放或指定宽高进行放大和缩小是视频编辑中最为常见的操作之一,这里我们将1920x1080的yuv图像序列转换成640x480的rgb图像序列,并输出到文件。视频图像转换的核心为一个SwsContext结构,其中保存了输入图像和输出图像的宽高以......
  • 24.C++中const和static的作用
    static●不考虑类的情况○隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用○默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区○静态变量在函数内定义,始终存在,且只进行一次初始......
  • 移植SDL到JZ2440显示BMP图片
    写这类教程的目的是,熟悉Linux基本操作和嵌入式开发流程,希望对你有所帮助. 前面我们讲过系统起来后开机LOGO的制作,韦老师第3期讲了如何显示jpeg图片,那么怎么显示bmp图片?这次我们借助libSDL来实现,我们先移植SDL到Ubuntu,体验它的威力后再移植到开发板。一、移植SDL到Ubun......
  • Centos文件压缩与打包43.240.72
    在linux下最常见的压缩文件通常都是以.tar.gz为结尾的,除此之外还有.tar.gz .bz2 .zip等等·gz gzip压缩工具压缩的文件43.240.73·bz2bzip2压缩工具压缩的文件43.240.74·tar tar打包程序打包的文件(tar并没有压缩功能,只是把一个目录合并成一个文件)·tar.gz 可以理......
  • 2024备考408Week16
    一、本周总结:使用时间:(离每周目标40h还差10h,差距还很大!)总计30h,数学12h50min,专业课12h9min,英语3h40min,政治1h21min。二、存在问题:1.数学、专业课(DS+OS+CO+CN)做题训练不够,思考不够深入,计算不够熟练和准确,后期一定要开始加强了;2.碎片化时间和整块时间没有合理安排,碎片化时间应该安排......
  • 「解题报告」2023.7.1 洛谷7月月赛
    『XYGOIround1』三个数题目描述MX有一个有\((w-2)\)个数的集合\(S=\{3,4,5,\cdots,w\}\)。要求构造一个只包含非负整数的集合(无重复元素),使得\(S\)里面的任何一个数都能被这个集合里面大于等于\(3\)个不同的数相加得到,求这个集合中至少包含多少个元素。输入格式本题......