算法篇:滑动窗口(一)
时间:2022-07-26
本文章向大家介绍算法篇:滑动窗口(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法:
这是滑动窗口的经典题目,通过题目我们可以将题目拆解成两步:
一、如何进行窗口的滑动。
这里我们可以采用双指针的方法,left不变的时候,
找到不重复的元素的右指针位置,那么窗口大小为right-left+1。
二、如何进行重复元素的判断。
我们采用hash的方式, 也就是golang中的map。
1.在移动left的时候,我们从map中移除没有移动之前的元素,也就是left-1那个位置的元素。
2.在移动right的时候,只要right对应的元素在map不存在,那么就存到map里面,并且后移right;
否则跳出循环,这里的right也就是本次窗口的最右侧位置。
题目: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
leetcode的官方题目分析:
代码实现:
func lengthOfLongestSubstring(s string) int {
// map用来判断是不是有重复的元素
m := map[byte]int{}
num := len(s)
// 右指针=-1表示什么都没操作,窗口大小一定>0,所以这里初始化为0
right,result := -1,0
for left :=0;left<num;left++ {
if left != 0 {
// 左指针向右移动一格,移除前面的那一个元素,例如:left =1之后,移除left=0的元素
delete(m,s[left-1])
}
// 每一次操作,右指针从[left,right]都是不重复的元素了,所以从right=1开始
for right+1<num&&m[s[right+1]]==0{
right++
m[s[right]]++
}
result = max(result,right-left+1)
}
return result
}
func max(num1, num2 int) int {
if num1>num2 {
return num1
}
return num2
}
执行结果:
备注:这里双指针的解决并不是滑动窗口的最优解法,不过确实最常用的解法,也比较容易想到,这也是笔者整理这一思路的主要原因。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux中crontab输出重定向不生效问题的解决方法
- Ubuntu中安装MySQL更改默认密码的步骤详解
- linux下用csplit命令分割文件的方法示例
- Linux基础命令之mktemp详解
- CentOS7设置jar应用程序开机启动的方法
- linux jexus服务设置开机启动
- linux如何利用crontab添加定时任务详解
- windows安装openssh并通过生成SSH密钥登录Linux服务器
- SSH设置别名访问远程服务器详细介绍
- Linux检查Swap交换空间的五个命令小结
- seaborn数据总体分布的可视化策略
- 配置 Apache 服务器禁止所有非法域名 访问自己的服务器
- Ubuntu16.04源码安装Mininet
- Kotlin基础学习之Deprecated与Suppress注解使用
- Centos 7下利用crontab定时执行任务详解