优选算法——滑动窗口2(数组模拟哈希表)

🔥近津薪荼:个人主页

🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》《Linux操作系统及网络基础知识分享》《近津薪荼的算法日迹》

✨每一个不曾起舞的日子,都是对生命的辜负。

2.上期参考代码:

cpp 复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n=nums.size();
        int left=0,right=0,length=n+1,sum =0;//初始化双指针和累加器
        while(right<nums.size())
        {
            sum+=nums[right];
            while(sum>=target)
            {
                length=min(right-left+1,length);
                sum-=nums[left++];
            }//维护窗口信息
            right++;
        }
        return length==n+1?0:length;
    }
};

滑动窗口的套路是很固定的,大家多做几道题目,把握其中规律,做题老丝滑了~

3.本期要讲解的题目是

无重复字符的最长子串

读题:

要点:

  • 无重复
  • 需要统计元素出现的次数**(哈希表)**
  • 最长
  • 子串(必须是连续的,示例三已强调)

4.解题

4.1暴力解法

双重循环遍历元素+哈希表统计元素出现次数

在遍历元素的过程中,将元素扔进哈希表统计它出现的次数,内层换如果遍历到的元素出现次数大于1,直接跳过接下来的遍历过程,外循环开始下一次遍历。

代码:
cpp 复制代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n=s.size(),ret=0;
        int i,j;
       for(i=0;i<n;i++)
       { 
        int hash[128]={0};//使用数组来模拟哈希表,每次外循环刷新
        for( j=i;j<n;j++)
        {
            hash[s[j]]++;
            if(hash[s[j]]>1)
            {
                ret=max(ret,j-i);
                break;
            }//有重复字符的情况
        }
         ret=max(ret,j-i);//处理无重复字符的情况
       }
       return ret;
    }
};

时间复杂度O(N*2),能过,但是还能优化

4.2优解

摸索

分析上述暴力解法,我们发现,每次统计数据的时候我们都要刷新哈希表,然后重新统计,之前统计的数据有部分还是需要重新在统计一遍,资源大大浪费,我们可以尝试找到一种方法,对之前的统计数据进行维护,提高代码效率。

我们先用双指针来模拟并改进暴力解法:

通过模拟我们发现,双指针可灵活维护统计数据,且双指针是同向移动的,同向双指针,也就是我们的滑动窗口,可以直接把嵌套for的N^2时间复杂度干成N。

发现了同向双指针,我们就可以使用滑动窗口的固定套路来写代码啦

代码逻辑

1.初始化双指针
2.进窗口:把元素扔进哈希表统计出现次数
3.条件判断:出现次数>2,开始出窗口
4.更新结果:出完窗口之后,子串一定是符合条件的,此时更新ret(在判断条件时更新结果也行,暴力解法中就是这么干的,但是要注意ret的真实长度应该是此次进窗口之前的子串长度)

敲代码去吧:

5.下期要讲解的题目是

最大连续1的个数 III

下期见。

相关推荐
Cx330_FCQ30 分钟前
Tmux使用
服务器·git·算法
熊猫钓鱼>_>1 小时前
ArkTS 装饰器总览:V1 / V2 / 通用装饰器完整学习笔记
笔记·学习·华为·交互·harmonyos·arkts·arkweb
拳里剑气2 小时前
C++算法:多源BFS
c++·算法·宽度优先·多源bfs
ysa0510302 小时前
【板子】短序列dp(换成维护更小常数维度的dp)
c++·笔记·算法·板子
shwill1232 小时前
PID 算法(三)--- 增量 PID ↔ 单神经元 PID 等价映射
linux·算法
wabs6664 小时前
关于图论【卡码网110.字符串迁移的思考】
数据结构·算法·图论
hanlin034 小时前
刷题笔记:力扣第242、349题(哈希表)
笔记·算法·leetcode
茯苓gao4 小时前
嵌入式开发笔记:CAN与CAN FD完全指南——从帧格式差异到MCU选型实战
网络·笔记·stm32·嵌入式硬件·学习·汽车
aramae5 小时前
C++ IO流完全指南:从C标准库到C++流式编程
服务器·c语言·开发语言·c++·后端
木木_王5 小时前
嵌入式学习 | STM32 裸板驱动开发(Day06) | DHT11温湿度传感器超详解(单总线时序+全套驱动代码+智能温湿度报警项目)
驱动开发·stm32·学习