首页 > 其他分享 >数组和双指针框架

数组和双指针框架

时间:2023-06-05 16:33:29浏览次数:53  
标签:二分 slow 数组 框架 元素 有序 指针




数组和双指针框架

  • 快慢指针:有序数组/链表原地去重、数组/链表原地删除
  • 快慢窗口指针:在限定条件下找最长/短的连续子序列/子串/子数组
  • 左右最值指针:缩减一维/二维有序搜索空间



 


快慢指针:有序数组/链表原地去重、数组/链表原地删除

题目:26.删除有序数组中的重复项

数组和双指针框架_链表


核心模式:

  • 数组已经排序,所以重复的元素一定连在一起

初始化一个慢指针和一个快指针都为0,慢指针记录最终的结果,快指针遍历整个数组。

快指针fast从数组第一个元素遍历到数组的最后一个元素,当快指针找到和慢指针不重复的值,就把fast的值赋予slow(不重复的数组添加到最终结果),并且slow指向下一个元素,最后 slow 就是需要的结果。

练习:第 83 题「删除排序链表中的重复元素」

如果给你一个有序的单链表,如何去重呢?

其实和数组去重是一模一样的,唯一的区别是把数组赋值操作变成操作指针而已。
 


题目:27.移除元素

数组和双指针框架_数据结构_02


原地删除也使用快慢指针。

初始化一个慢指针和一个快指针都为0,慢指针记录最终的结果,快指针遍历整个数组。

快指针fast从数组第一个元素遍历到数组的最后一个元素,当快指针找到的不是需要删除的值,就把fast的值赋予slow(没被删除的元素添加到最终结果),并且slow指向下一个元素,最后 slow 就是需要的结果。

 


快慢窗口指针:在限定条件下找最长/短的连续子序列/子串/子数组

滑动窗口:

  • 3.无重复字符的最长子串
  • 209.长度最小的子数组
  • 219.存在重复元素 II
  • [220].存在重复元素 III
/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;
    int left = 0, right = 0;
    int valid = 0;
    while (right < s.size()) {
        char c = s[right];         // c 是将移入窗口的字符
        right++;                   // 右移(增大)窗口
        // 进行窗口内数据的一系列更新
        while (window needs shrink) {
            char d = s[left];      // d 是将移出窗口的字符
            left++;                // 左移(缩小)窗口
        }
    }
}

数组和双指针框架_有序数组_03

 


左右最值指针:缩减一维/二维有序搜索空间

左右指针实现的二分查找,能缩减一维有序数组的搜索空间,每次排除一半的元素来减少比较的次数。

因为一维有序数组的二分查找,太普及了,就不额外写了。

可在二维有序空间中却不能使用二分查找。

二分搜索的中间点,显然应该是矩阵的中心点:

数组和双指针框架_链表_04


这个中心点把矩阵分成的四个部分中,只有左上部分全部小于中心点,只有右下部分全部大于中心点。也就是说做一次比较最多只能削减 1/4 的搜索空间。更大的问题是,删除掉左上部分或者右下部分之后,剩余的形状不再是一个规则的矩形,就无法继续进行二分搜索了。

数组和双指针框架_算法_05

二分查找只能做左上、右下的切分,左下、右上不能二分。

其实左右指针的搜索算法,不止可以有一维的二分搜索,还有二维的行列搜索,每次排除一行/列元素来减少比较的次数。

题目:167.俩数之和

数组和双指针框架_有序数组_06


使用了两个指针,一个只向左移动,一个只向右移动。走完一趟,就得到了答案。

具体解析:



标签:二分,slow,数组,框架,元素,有序,指针
From: https://blog.51cto.com/u_13937572/6417566

相关文章

  • pycharm的scrapy框架-断点调试
    在文件根目录,也就是settings.py的上级目录,scrapy.cfg的同级目录,创建main.py:fromscrapy.cmdlineimportexecuteimportosimportsysif__name__=='__main__':sys.path.append(os.path.dirname(os.path.abspath(__file__)))execute(['scrapy','crawl......
  • 搭建Scrapy基础框架
    官方教程:安装指南—Scrapy2.5.0文档第一步:下载并安装python3.9第二步:下载并安装Anaconda下载地址:Anaconda|IndividualEdition第三步:安装scrapycmd命令:condainstall-cconda-forgescrapy第四步:创建scrapy项目:新建一个文件夹作为存放项目的空间:cmd到存放项目的文件夹:s......
  • Leetcode 2460. 对数组执行操作
    题目:给你一个下标从0开始的数组nums,数组大小为n,且由非负整数组成。你需要对数组执行n-1步操作,其中第i步操作(从0开始计数)要求对nums中第i个元素执行下述指令:如果nums[i]==nums[i+1],则nums[i]的值变成原来的2倍,nums[i+1]的值变成0。否则,跳过......
  • 1.6. 数组
    数组是一种数据结构,用于存储相同类型的多个元素。在Java中,数组是一个对象,它具有一定数量的连续内存空间。数组中的每个元素都有一个索引,用于访问和操作元素。1.6.1.数组的声明与初始化在Java中,可以使用以下语法声明一个数组:元素类型[]数组名;要创建一个数组,需要使用 n......
  • Docker运行Django框架
    Django框架创建django-pg项目目录[root@docker~]#mkdirdocker-compose-django[root@docker~]#cddocker-compose-django/[root@dockerdocker-compose-django]#mkdirdjango-pg在项目目录下创建docker-compose.yml文件该文件定义了两个服务,一个是名为db的Postgres数......
  • go语言数组
    线性数据结构线性表是一种抽象的数学概念,是一组元素的序列的抽象,它由有穷个元素组成(0个或任意个)。包括顺序表和链接表。顺序表:使用一大块连续的内存顺序存储表中的元素,这样实现的表称为顺序表,或称连续表在顺序表中,元素的关系使用顺序表的存储顺序自然地表示;链接表:在存储空间......
  • 如易云揭秘1-框架
          如易云是什么如易云的框架是业务系统开发和技术中间件之前的桥梁,是对业务领域深入理解后的精巧封装,可以大大提升开发效率。全景图我对每块,做下简单说明。       se-context,业务上下文(主要是用户信息),大家都懂的。因为集成了springsecurity,基本......
  • 如易云揭秘1-框架(cache)
    Hibernate老鸟的话,对于Hibernatecache的精妙实现应该都是非常了解,即便不了解其实现原理,也知道Hibernatecache非常的易用,集成EhCache,对于系统性能也有很好的提升。那我们来看看如易云的框架,如易云的框架基于Mybatis,Mybatis新版本中也集成了cache,并且也有开源......
  • 718. 最长重复子数组
    给两个整数数组nums1和nums2,返回两个数组中公共的、长度最长的子数组的长度。示例1:输入:nums1=[1,2,3,2,1],nums2=[3,2,1,4,7]输出:3解释:长度最长的公共子数组是[3,2,1]。>动态规划classSolution{public:intfindLength(vector<int>&nums1,ve......
  • C++智能指针:weak_ptr
    weak_ptr虽然是智能指针,但实际上是作为shared_ptr的辅助指针使用。weak_ptr通常不单独使用,一般用于查看对应的shared_ptr的信息。weak_ptr没有重载*,->等指针运算符。weak_ptr对象不会影响shared_ptr对象的引用计数。 #include<iostream>#include<string.h>#include<memory......