【Java算法】滑动窗口
🔥个人主页: 中草药
🔥专栏:【算法工作坊】算法实战揭秘
👖一. 长度最小的子数组
题目链接:209.长度最小的子数组
算法原理
滑动窗口
滑动窗口算法常用于处理数组/字符串等序列问题,通过定义一个窗口(即一段连续的元素),并根据某种条件动态调整窗口的左右边界来找到满足条件的子序列。
在这个问题中,滑动窗口的具体应用如下:
-
初始化:设置两个指针
left
和right
,均初始化为0,表示窗口的左右边界。同时,初始化sum
为0,用于累计窗口内元素的和,minlen
设置为Integer.MAX_VALUE
,用于记录符合条件的最小子数组长度。 -
扩展右边界:不断将右指针
right
向右移动,并将nums[right]
加入到sum
中,这相当于不断扩大窗口右侧,尝试包含更多的元素以满足和至少为target
的条件。 -
收缩左边界:当窗口内的元素和
sum
至少达到target
时,开始尝试缩小窗口左侧,即增加left
指针的值,并从sum
中减去移出窗口的元素nums[left]
。这个过程会持续进行,直到sum
小于target
,确保每次收缩都检查当前窗口是否仍然满足条件。 -
更新最小长度:在每次收缩窗口后(即
sum
小于等于target
时),用当前窗口的长度(right - left + 1
)更新minlen
,保持记录最短的满足条件的子数组长度。 -
遍历结束:当右指针遍历完整个数组后,检查
minlen
是否仍为初始值Integer.MAX_VALUE
,如果是,则说明没有找到满足条件的子数组,返回0;否则返回minlen
作为结果。
时间复杂度与空间复杂度
- 时间复杂度:O(n),其中n为数组
nums
的长度。每个元素最多被访问两次,一次作为窗口扩展时加入,一次作为窗口收缩时移除。 - 空间复杂度:O(1),只使用了固定数量的变量,与输入数组大小无关。
综上所述,这段代码利用滑动窗口算法高效地解决了寻找最小长度子数组使其和至少为目标值的问题。
代码
public int minSubArrayLen(int target, int[] nums) {int sum=0,minlen=Integer.MAX_VALUE;//无穷大for(int left=0,right=0;right<nums.length;right++){sum+=nums[right];//进窗口while(sum>=target){//出窗口minlen=Math.min(minlen,right-left+1);sum-=nums[left++];}}if(minlen==Integer.MAX_VALUE){return 0;}return minlen;}
举例
测试用例 [2,3,1,2,4,3]
初始状态
sum = 0
minlen = Integer.MAX_VALUE
- 初始化双指针:
left = 0
,right = 0
执行过程
第一轮迭代
- right=0:
sum += nums[0] = 2
, 现在sum = 2
, 不满足sum >= target
,right++
。 - right=1:
sum += nums[1] = 3
, 现在sum = 5
, 不满足sum >= target
,right++
。 - right=2:
sum += nums[2] = 1
, 现在sum = 6
, 不满足sum >= target
,right++
。 - right=3:
sum += nums[3] = 2
, 现在sum = 8
, 满足sum >= target
。
这时进入内部的 while
循环。
第一次窗口收缩
sum >= target
,计算子数组长度right-left+1 = 4
,更新minlen = Math.min(minlen, 4) = 4
。- 从
sum
中减去nums[left++] = nums[0] = 2
,得到sum = 6
,继续在循环内检查。 - 再次检查
sum >= target
,是的,所以继续收缩。 - 从
sum
中减去nums[left++] = nums[1] = 3
,得到sum = 3
,现在sum < target
,退出while
循环。
接下来
- 继续移动
right
,累加sum
直至再次满足条件或遍历完数组。
第二次满足条件
- right=4:
sum += nums[4] = 4
,现在sum = 7
,满足sum >= target
。 - 计算子数组长度
right-left+1 = 2
,更新minlen = Math.min(minlen, 2) = 2
。 - 由于这次
sum
正好等于target
,收缩窗口会导致sum < target
,因此不会进一步收缩。
遍历完成
- 继续移动
right
,但不再有新的子数组满足条件且长度更小。
结果
遍历结束后,minlen = 2
,这是满足条件的最小子数组长度,对应子数组是 [4,3]
。
🩰二.无重复字符的最长子串
题目链接:3.无重复字符的最长子串
算法原理
-
初始化:定义两个指针
left
和right
,初始都指向字符串的起始位置,即left = 0
,right = 0
。hash
数组用于记录 ASCII 字符出现的次数(考虑到 ASCII 总共有 128 个字符,故数组大小为 128)。ret
用于存储最长无重复子串的长度,初始化为 0。 -
扩展右边界:不断地将右指针
right
向右移动,每移动一次,就将当前字符ch[right]
在hash
数组中的计数加一。这意味着窗口正在尝试包含更多的字符。 -
处理重复字符与收缩左边界:如果
hash[ch[right]]
大于 1,表明当前字符ch[right]
已经在窗口内出现过,这时需要移动左指针left
,将left
指向的字符在hash
中的计数减一,同时左指针右移一位,以此来排除重复字符,保证窗口内的字符都是唯一的。 -
更新最大长度:每次移动右指针时,都计算当前窗口的长度(即
right - left + 1
),并将这个长度与当前已知的最大长度ret
进行比较,取较大者更新ret
。这样可以保证ret
始终保存着遇到过的最长无重复字符子串的长度。 -
遍历结束:当右指针
right
遍历到字符串末尾时,循环结束,返回ret
作为最终结果。
时间复杂度与空间复杂度
- 时间复杂度:O(n),其中 n 是字符串的长度。每个字符最多被访问两次,一次作为右边界扩展,一次作为左边界收缩。
- 空间复杂度:O(1),虽然使用了
hash
数组,但它是一个固定大小的数组(128),与输入字符串的长度无关,因此空间复杂度是常数级别的。
总之,这段代码通过巧妙地利用滑动窗口和哈希表(在这里是简化版的数组实现)减少了不必要的字符比较,从而高效地求解了最长无重复字符子串的长度问题。
代码
public int lengthOfLongestSubstring(String s) {int left=0,right=0;char[] ch=s.toCharArray();int[] hash=new int[128];//用数组模拟哈希表int ret=0;while(right<s.length()){hash[ch[right]]++;while(hash[ch[right]]>1){hash[ch[left++]]--;}ret =Math.max(ret,right-left+1);right++;}return ret;}
举例
测试用例 "abcabcbb"
初始化
left = 0
,right = 0
char[] ch = {'a', 'b', 'c', 'a', 'b', 'c', 'b', 'b'}
int[] hash
初始化为全0,用于记录字符出现次数ret = 0
,用于记录最长无重复子串长度
执行过程
-
右指针移动 & 记录字符
- right=0:
'a'
,hash['a'] = 1
,right++
- right=1:
'b'
,hash['b'] = 1
,right++
- right=2:
'c'
,hash['c'] = 1
,right++
。此时,窗口abc
无重复字符,ret = 3
- right=0:
-
发现重复,收缩左边界
- right=3:
'a'
,hash['a'] = 2
,发现重复,开始收缩左边界,hash['a']--
,left++
- right=3:
-
继续扩展与收缩
- right=4:
'b'
,hash['b'] = 2
,收缩左边界,hash['b']--
,left++
- right=5:
'c'
,hash['c'] = 2
,收缩左边界,hash['c']--
,left++
。此时窗口内为bc
,无重复字符,ret
保持为3
- right=4:
-
重复与扩张
- right=6:
'b'
,hash['b'] = 3
,收缩左边界,hash['b']--
,left++
- right=7:
'b'
,hash['b'] = 3
,继续收缩左边界,hash['b']--
,left++
。此时窗口为空,ret
保持为3
- right=6:
结果
- 最后,所有字符遍历完毕,返回
ret
的值,即最长无重复字符的子串长度为 3。在这段字符串中,满足条件的最长子串是"abc"
。
这段代码通过动态调整窗口(由 left
和 right
定义)大小,有效利用哈希表(此处为简化版的 hash
数组)快速判断字符是否重复,最终找到了最长的无重复字符子串。
🎩三.最大连续1的个数III
题目链接:1004.最大连续1的个数III
算法原理
-
初始化:定义三个指针
left
,right
, 和一个计数器zero
,分别用来表示窗口的左边界、右边界以及窗口内 0 的数量。同时,定义ret
来存储最长子数组的长度,初始化为 0。 -
扩展右边界:不断将右指针
right
向右移动,每次移动时检查新进入窗口的元素(nums[right]
)是否为 0,如果是,则将zero
计数器加 1。这意味着窗口正在尝试包含更多的元素,包括 0。 -
处理限制条件:当窗口内 0 的数量超过了允许的最大数量
k
时,需要移动左指针left
来缩小窗口,直到窗口内 0 的数量回到k
或更少。在移动left
的过程中,如果移出窗口的元素是 0,则将zero
减 1。 -
更新最长子数组长度:在每次移动右指针之后(即每次尝试扩大窗口或维持窗口大小但可能更新了窗口内容后),都会用当前的右指针减去左指针再加 1 来计算当前窗口的长度,并用这个长度去更新
ret
的值,保持ret
存储的是最长子数组的长度。 -
遍历结束:当右指针遍历完整个数组后,循环结束,此时
ret
中存储的就是满足条件的最长连续子数组的长度。
时间复杂度与空间复杂度
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。每个元素最多被遍历一次。 - 空间复杂度:O(1),因为使用的变量数量是固定的,不依赖于输入数组的大小。
代码
public int longestOnes(int[] nums, int k) {int ret=0;for(int left=0,right=0,zero=0;right<nums.length;right++){if (nums[right]==0) zero++;while (zero>k){if (nums[left++]==0) zero--;}ret=Math.max(ret,right-left+1);}return ret;}
举例
测试用例 [1,1,1,0,0,0,1,1,1,1,0]
初始化
left = 0
,right = 0
,zero = 0
,ret = 0
。
执行过程
-
右指针移动:初始化时数组内的前三个元素都是1,右指针向右移动,窗口内没有0,
zero
仍为0,此时最长子数组长度为3,但随着右指针的移动,情况会变化。 -
遇到0并处理:
- 当
right = 3
,遇到第一个0,zero = 1
。 - 当
right = 4
,遇到第二个0,zero = 2
,达到了k = 2
的限制。 - 此时窗口
[1,1,1,0,0]
,满足条件,长度为5,更新ret = 5
。
- 当
-
收缩左边界:
- 当
right = 5
,遇到第三个0,由于zero
已经是2,需要移动左指针。当left = 3
,nums[left++]
是0,zero--
,此时窗口内0的个数回到1,窗口变为[1,0,0,1,0,0]
。
- 当
-
继续扩展右边界:
- 继续移动右指针,忽略更多的0,直到
right = 8
,窗口为[0,0,1,1,1,1,1,1]
,此时zero = 2
(最初的两个0),窗口长度为6,更新ret = 6
。
- 继续移动右指针,忽略更多的0,直到
-
之后的步骤:
- 当
right
继续移动并遇到更多0时,由于已经找到了长度为6且满足条件的子数组,即使右边界继续扩大,也不会影响最终答案,因为任何新加入的0都会导致左侧边界相应移动,保持最多2个0在窗口内。
- 当
结论
- 最终返回
ret = 6
,表示最长的连续子数组是[0,0,1,1,1,1]
🧢四.将x减到0的最小操作数
题目链接:11658.将x减到0的最小操作数
算法原理
-
计算总和:首先遍历数组
nums
,计算其所有元素之和sum
。如果sum
小于目标值x
,直接返回-1
,因为无论如何操作都无法使子数组之和等于x
。 -
确定目标值:需要找到一个和为目标
x
的子数组,但实际操作中,我们是在找一个和为target = sum - x
的子数组。这是因为我们需要从总和中减去x
来达到操作的目的。 -
双指针滑动窗口:
- 初始化两个指针
left
和right
都为 0,同时维护一个变量cur
表示当前窗口内的元素和。 - 右指针
right
向右移动,将nums[right]
加入当前窗口的和cur
。 - 如果
cur
大于目标值target
,则说明当前窗口和过大,需要减小窗口左侧的值,即减去nums[left]
并将left
指针右移一位,同时更新cur
。 - 当
cur
等于target
时,说明找到了一个符合条件的子数组。此时更新最大长度ret
为当前子数组的长度(right-left+1
)。 - 继续移动右指针,重复上述过程,直到右指针遍历完整个数组。
- 初始化两个指针
-
结果处理:
- 如果在整个过程中没有找到符合条件的子数组(即
ret
仍为初始值-1
),返回-1
。 - 若找到了符合条件的子数组,返回数组长度减去找到的最长子数组长度,即
nums.length - ret
。这代表需要的操作次数,因为要使得剩下的部分和为x
,整个数组的剩余部分(非连续子数组)需要通过减少操作来匹配。
- 如果在整个过程中没有找到符合条件的子数组(即
时间复杂度与空间复杂度:
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。每个元素最多被访问两次,一次在计算总和时,一次在滑动窗口中。 - 空间复杂度:O(1),使用的额外空间与输入数组的大小无关,只使用了几个固定变量。
代码
public int minOperations(int[] nums, int x) {int sum=0;int ret=-1;for (int a : nums){sum+=a;}if(sum<x){return -1;}int target=sum-x;for (int left=0,right=0,cur=0;right<nums.length;right++){cur+=nums[right];while(cur>target){cur-=nums[left++];}if (cur==target){ret=Math.max(ret,right-left+1);}}if(ret==-1){return -1;}return nums.length-ret;}
举例
测试用例 nums=[1,1,4,2,3],x=5
初始化
-
首先,遍历数组
nums
计算所有元素之和sum
。sum = 1 + 1 + 4 + 2 + 3 = 11
-
检查
sum
是否小于x
,若小于则直接返回-1
,这里不适用,因为11 >= 5
。 -
计算目标和
target
为sum - x
。target = 11 - 5 = 6
滑动窗口
接下来,使用双指针(left
和 right
)进行滑动窗口操作,同时维护窗口内元素和 cur
。
-
初始化:
left = 0
,right = 0
,cur = 0
。 -
遍历数组:
- 右指针移动:
right
开始从 0 向右移动,每次移动将nums[right]
加入cur
。- 当
right = 0
,cur = 0 + 1 = 1
(此时cur < target
) - 当
right = 1
,cur = 1 + 1 = 2
(此时cur < target
) - 当
right = 2
,cur = 2 + 4 = 6
,此时cur == target
,记录子数组长度,ret = Math.max(ret, right-left+1) = Math.max(-1, 3) = 3
,并且开始收缩窗口。 - 由于
cur
等于target
,无需移动left
。
- 当
- 右指针移动:
-
继续移动右指针:
- 当
right = 3
,cur = 6 + 2 = 8
(此时cur > target
),需要收缩窗口。- 移动
left
,cur -= nums[left++] = 8 - 1 = 7
,left = 1
,此时cur > target
继续移动left
。 - 再次移动
left
,cur -= nums[left++] = 7 - 1 = 6
,left = 2
,此时cur == target
,不需要进一步移动left
。
- 移动
- 当
-
遍历结束:
- 右指针继续移动,但在本次测试用例中,不会再次找到满足条件的子数组,因此
ret
保持为3
。
- 右指针继续移动,但在本次测试用例中,不会再次找到满足条件的子数组,因此
结果处理
- 最后,检查
ret
是否为-1
,如果不是,则返回nums.length - ret
,因为这是从整个数组长度中减去满足条件的子数组长度,即需要操作的次数。return nums.length - ret = 5 - 3 = 2
结论
对于测试用例 nums=[1,1,4,2,3]
和 x=5
,这段代码会返回 2
,意味着需要至少操作两次,使得数组中某一段连续子数组之和等于 x=5
。具体来说,可以通过减少前两个元素各一次(即 1-1=0
和 1-1=0
),使得剩下的数组 [0,0,4,2,3]
中 4+2=6
符合要求。
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐
制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸
相关文章:

【Java算法】滑动窗口
🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 👖一. 长度最小的子数组 题目链接:209.长度最小的子数组 算法原理 滑动窗口 滑动窗口算法常用于处理数组/字符串等序列问题,通过定义一…...
C# —— 属性和字段
属性和字段的区别 1.都是定义在一个类中,属于类成员变量 2.字段一般都是私有的private,属性一般是公开的Public 3.字段以小驼峰命名方式 age,属性一般是以大驼峰命名 Age 4.字段可以存储数据,属性不能存储数据,通过属性…...

【计算机视觉】人脸算法之图像处理基础知识(四)
图像的几何变换 图像的几何变换是指在不改变图像内容的前提下对图像的像素进行空间几何变换。主要包括图像的平移变换、镜像变换、缩放和旋转等。 1.插值算法 插值通常用来放缩图像大小,在图像处理中常见的插值算法有最邻近插值法、双线性插值法、二次立方、三次…...
探索 Spring Boot 集成缓存功能的最佳实践
在线工具站 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站:…...

微信小程序使用方法
一.在网页注册小程序账号(在未注册的情况下) 1.如果你还没有微信公众平台的账号,请先进入微信公众平台首页,点击 “立即注册” 按钮进行注册。我们选择 “小程序” 即可。 接着填写账号信息,需要注意的是,…...

前后端分离的后台管理系统源码,快速开发OA、CMS网站后台管理、毕业设计项目
那有没有一款软件解-决这种现状呢?答案是肯定的。引入我们的软件——eladmin。 介绍 ELADMIN,一个简单且易上手的 Spring boot 后台管理框架,已发布 Mybatis-Plus 版本,为开发者提供了一个全-面、高-效的解-决方案。 特点 高-效率:前后端完全分离,项目简单可配,内置代码…...

[深度学习]--分类问题的排查错误的流程
原因复现: 原生的.pt 好使, 转化后的 CoreML不好使, 分类有问题。 yolov8 格式的支持情况 Format Argument Suffix CPU GPU 0 PyTorch - .pt True True 1 Tor…...

微信小程序简易录音机
首先先创建一个项目(想必大家都会啦那就直接开干) 首先上html结构 <view class"wx-container"><view id"title">录音机</view><view id"time">{{hours}}:{{minute}}:{{second}}</view>&l…...

Ollama深度探索:AI大模型本地部署的全面教程
目录 引言一、Ollama概述1、定义与定位2、核心功能3、技术优势4、应用场景 二、安装与配置1、系统要求2、安装方法3、配置指南4、启动Ollama服务 四、快速开始1、启动Ollama2、部署运行模型3、REEST API 五、自定义模型1、定制化的必要性2、使用Modelfile定制模型3、参数调整4、…...

文心一言 VS 讯飞星火 VS chatgpt (285)-- 算法导论21.2 4题
四、请给出图 21-3 所示操作序列的一个运行时间的渐近紧确界,假定使用链表表示和加权合并启发式策略。如果要写代码,请用go语言。 文心一言: 图 21-3 没有直接给出,但通常这种操作序列可能与某种数据结构(如并查集或…...

基于springboot实现影院订票系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现影院订票系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本影院订票系统就是在这样的大环境下诞生,其可以帮助管理者在…...
Linux 常用命令合集
进入root模式 su -> 回车 -> 输入root用户密码关闭系统 方法1: shutdown -h now 方法2: init 0 方法3: telinit 0按预定时间关闭系统 shutdown -h hours:minutes &取消按预定时间关闭系统 shutdown -c重启 shutdown -r now重启…...

Vue3插件安装
一、volar插件安装 volar:Vue文件的语法提示和高亮提醒。volar已经更名为Vue - Official,其安装步骤如下。 (1)打开vscode,点击扩展面板,在搜索窗口中输入volar,选择Vue - Official进行安装。 (2࿰…...

Redis精要
一、什么是缓存击穿、缓存穿透、缓存雪崩? 缓存穿透 【针对大量非法访问的请求,缓存中没有,直接访问DB】 缓存穿透指的查询缓存和数据库中都不存在的数据,这样每次请求直接打到数据库,就好像缓存不存在 一样。 对于系…...

国产24位I2S输入+192kHz立体声DAC音频数模转换器CJC4344
CJC4344是一款立体声数模转换芯片,内含插值滤波器、multi bit数模转换器、输出模拟滤波器。CJC4344系列支持大部分的音频数据格式。CJC4344基于一个带线性模拟低通滤波器的四阶multi-bitΔ-Σ调制器,而且本芯片可以通过检测信号频率和主时钟频率…...

UniApp 开发微信小程序教程(一):准备工作和环境搭建,项目结构和配置
文章目录 一、准备工作和环境搭建1. 安装 HBuilderX步骤: 2. 注册微信开发者账号步骤: 3. 创建 UniApp 项目步骤: 二、项目结构和配置1. UniApp 项目结构2. 配置微信小程序修改 manifest.json修改 pages.json 3. 添加首页文件index.vue 示例&…...

[WTL/Win32]_[中级]_[MVP架构在实际项目中的应用]
场景 在开发Windows和macOS的界面软件时,Windows用的是WTL/Win32技术,而macOS用的是Cocoa技术。而两种技术的本地语言一个主打是C,另一个却是Object-c。界面软件的源码随着项目功能增多而增多,这就会给同步Windows和macOS的功能造成很大负担…...

《Windows API每日一练》5.2 按键消息
上一节中我们得知,Windows系统的按键消息有很多类型,大部分按键消息都是由Windows系统的默认窗口过程处理的,我们自己只需要处理少数几个按键消息。这一节我们将详细讲述Windows系统的所有按键消息及其处理方式。 本节必须掌握的知识点&…...
adb 截屏和录屏命令
adb 录屏命令 screenrecord 简介 screenrecord 是一个 shell 命令 支持 Android 4.4(API level 19)以上 支持视频格式: mp4 一些限制 某些设备可能无法直接录制,原因是分辨率太高,如果遇到此类问题,请试着指定较低的分辨率 不支持录制过程中屏幕旋转,如果录制…...

springboot相关的一些知识
SpringBoot可以同时处理多少请求 SpringBoot默认的内嵌容器是Tomcat,所以SpringBoot可以同时处理多少请求取决于Tomcat。 SpringBoot中处理请求数量相关的参数有四个: server.tomcat.thread.min-spare:最少的工作线程数,默认大小…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...