双索引技术

双索引技术(Two Pointer)

滑动窗口:这两个索引表示的是一个窗口,让这个窗口不停的在数组中滑动,来找到问题的解。

-什么叫子数组:可以不连续。但是本题强调了是要连续的。、

解法一:滑动窗口

时间复杂度:O(n),空间复杂度O(1) 因为没有另外开辟空间。

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        //初始化,希望区间不包含任何元素
        int l = 0, r = -1;   //nums[l...r]为我们的滑动窗口
        int sum = 0;    //和
        int res = nums.size()+1;    //连续子数组初始化为数组的长度+1

        while(l<nums.size()){
            if(r+1<nums.size() && sum<s){
                r++;
                sum += nums[r];     //应注意r的取值不能越界
            }
            else{
                sum -= nums[l];
                l++;
            }
            if(sum >= s)
                res = min(res, r-l+1);
        }

        if(res == nums.size()+1)
            return 0;

        return res;
    }
};

思路:和209类似采用滑动窗口的思路。在[l...r]区间中表示不重复的字符集,为了扩大当前的字符集,加载一位新的元素时要判断新元素是否在[l...r]中,若不在扩大r+1,若在就将左边界l减至重复元素之后。在此期间不断更新维护字符区间的长度。

如何判断新的元素是否在字符集区间呢?遍历查找?find?这里有个小技巧,查表
预定义一个256大小的数组来维护字符集区间内元素出现的频率freq[256]初始为0,当加入1个元素对应的元素下标+1,当从字符集中删除一个元素对应删除元素下标需要-1,最终通过查表来看该元素是否在字符集空间。  这个想法很巧妙啊 :)

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int freq[256] = {0};   //记录数组中的字符出现的频率
        int l=0, r = -1;      //滑动窗口为s[l...r]
        int res = 0;         //满足条件的字串的最长长度

        while(l<s.size()){
            if(r+1<s.size() && freq[s[r+1]]==0){
                //r+1为下标的字符出现的频率为0时,可以向右扩张
                r++;
                freq[s[r]]++;
            }
            else{
                //重复出现时,左侧窗口向右移,即缩小
                freq[s[l]]--;
                l++;
            }
            res = max(res, r-l+1);
        }
        return res;
    }
};

原文地址:https://www.cnblogs.com/Bella2017/p/10159234.html

时间: 2024-11-09 00:46:39

双索引技术的相关文章

内存数据库中的索引技术

引言 传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称作磁盘数据库(DRDB: Disk-Resident Database).磁盘数据库需要频繁地访问磁盘来进行数据的操作,磁盘的读写速度远远小于CPU处理数据的速度,所以磁盘数据库的瓶颈出现在磁盘读写上. 基于此,内存数据库的概念被提出来了.内存数据库(MMDB:Main Memory Database,也叫主存数据库)[1],就是将数据全部或者大部分放在内存中进行操作的数据库管理系统,对查询处理.并发控制与恢复的算法和数据结构进行重

双缓冲技术讲解

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 首先要搞清楚计算机运行原理,计算机载运行时是将将最大的任务分解成多个任务,然后一个接一个地执行. 一个典型的例子,每个游戏引擎必须解决的问题是渲染. 当游戏画出用户看到的世界时,比如

[论文]内存数据库中的索引技术

原创性申明 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/42490335 转载请注明出处 引言 传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称作磁盘数据库(DRDB: Disk-Resident Database).磁盘数据库需要频繁地访问磁盘来进行数据的操作,磁盘的读写速度远远小于CPU处理数据的速度,所以磁盘数据库的瓶颈出现在磁盘读写上. 基于此,内存数据库的概念被提出来了.内存数据库(MMDB:Main Memory

avalon与双缓冲技术

avalon与双缓冲技术 avalon1.5一个重要技术升级是引进异步渲染.异步渲染在游戏界有一个更专业的名字,叫双缓冲.游戏界要刷新界面与我们刷新浏览器视图,面临的问题是一致的.视图是由许多存在套嵌关系的方块组成,它们每一个的改动,都可能引起reflow(其父节点,其父父节点的大小重新计算),这是造成性能问题的关键. 双缓冲技术的主要原理是:当一个动画争先显示时,程序又在改变它,前面的画面还没显示完,程序又要求重新绘制,这样屏幕就会不停闪烁.为了避免闪烁,可以使用双缓冲技术,将要处理的图片都放

OpenGL中实现双缓冲技术

在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);.这里将我们惯用的GLUT_SINGLE替换为GLUT_DOUBLE,意为要使用双缓冲而非单缓冲. 2. 调用glutDisplayFunc(display)注册回调函数时, 在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针. 3. 调用

c++双缓冲技术绘图避免闪烁

当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图. 双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度.双缓冲实现过程如下: 1.在内存中创建与画布一致的缓冲区 2.在缓冲区画图 3.将缓冲区位图拷贝到当前画布上 4.释放内存缓冲区 在图形图象处理编程过程中,双缓冲是一种基本的技术.我们知道,如果窗体在响应WM_PAINT消息的时候

Win32 GDI 非矩形区域剪裁,双缓冲技术

传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X-window协议.你信或者不信,那些看上去很花哨的控件,其实就是一笔一划画上去的而已.GDI提供了画笔(用于线条).画刷(用于填充).调色板(用于支持256色显示).字体(用于文字).如果简单的图形不足以表达,你可以使用位图和画布(DC,设备上下文)直接将图像绘制到屏幕上去.此外,GDI还支持一些简

Android开发之用双缓冲技术画图

双缓冲技术主要用在绘图,动画效果上,其原理就是:将资源先加载到缓冲区,然后再将缓冲区整个加载到View上面去.双缓冲技术能够有效防止闪烁,提高显示质量. DrawView.java: package com.example.handdraw; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.C

【重磅预告】揭秘阿里双11技术进步历程!

摘要: 对技术而言,每一年的双11都是一场严峻的考验,从被流量冲击得溃不成军,被迫奋起抗击,到现在通过技术的力量不断改写双11的用户体验和参与感,阿里的技术伴随着双11成长起来,强壮起来,自信起来.对各位而言,希望大家可以从书中学习更多,掌握更多. 从2009年到2016年 有一种"买买买"叫双11 你我已熟知 那激动人心的熬夜抢购 那争分夺秒的零点瞬间 -- 还有那刷新不出的页面 和那挤爆了的服务器 -- 八年演进.八年创新.八年突破 这举世瞩目的双11,背后靠什么支撑? 这八年 阿