当前位置: 首页 > news >正文

不定长滑动窗口---初阶篇

目录

引言

求最长/最大

3. 无重复字符的最长子串

3090. 每个字符最多出现两次的最长子字符串

1493. 删掉一个元素以后全为 1 的最长子数组

1208. 尽可能使字符串相等

904. 水果成篮

1695. 删除子数组的最大得分

2958. 最多 K 个重复元素的最长子数组

2024. 考试的最大困扰度

1004. 最大连续1的个数 III

1658. 将 x 减到 0 的最小操作数

求最短/最小

209. 长度最小的子数组

2904. 最短且字典序最小的美丽子字符串

求子数组个数

越长越合法型

1358. 包含所有三种字符的子字符串数目

2962. 统计最大元素出现至少 K 次的子数组

3325. 字符至少出现 K 次的子字符串 I

2799. 统计完全子数组的数目

越短越合法型

713. 乘积小于 K 的子数组

3258. 统计满足 K 约束的子字符串数量 I

2302. 统计得分小于 K 的子数组数目

LCP 68. 美观的花束

恰好型滑动窗口

930. 和相同的二元子数组

1248. 统计「优美子数组」

3306. 元音辅音字符串计数 II

992. K 个不同整数的子数组

加餐

1438. 绝对差不超过限制的最长连续子数组

2401. 最长优雅子数组

438. 找到字符串中所有字母异位词

总结


引言

继上一篇关于《定长滑动窗口》的分析,本文将会重点分析不定长滑动窗口这一算法,不定长滑动窗口毫无疑问其窗口的大小是不确定的,其他就与定长滑动窗口一样了,解题思想还是:入窗口---更新答案---出窗口。依旧结合灵神分享的算法题单对每个题目进行解析。ps:本篇博客中的所有题目均来自于灵茶山艾府 - 力扣(LeetCode)分享的题单。

定长滑动窗口---初阶篇-CSDN博客文章浏览阅读758次,点赞37次,收藏25次。滑动窗口基于暴力解法的优化,将时间复杂度降到线性,解题时的关键是定义好循环不变量。掌握好滑动窗口,可以进一步提升你的算法能力和解题效率。本文将帮助读者正确的使用滑动窗口,理解其应用场景。 https://blog.csdn.net/2401_87944878/article/details/147719085

求最长/最大

不定长滑动窗口第一类题型:求最大值/求最长范围。本类题型解法:通过维护一段区间,控制题干的临界范围来找到最大值或最大范围,下面将根据具体题目进行分析。

3. 无重复字符的最长子串

题解:使用滑动窗口,在没有重复字符时持续入,当有重复字符时就出窗口。

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_set<char> ss; //存储已经存在的字符int left=0,n=s.size();int ret=0;for(int right=0;right<n;right++){while(ss.count(s[right]))   //如果当前字符已经存在,需要出窗口{ss.erase(s[left++]);}ss.insert(s[right]);  //进窗口ret=max(ret,right-left+1);   //更新答案}return ret;}
};

3090. 每个字符最多出现两次的最长子字符串

题解:与上一题一样,还是采用滑动窗口的方式进行解决。

class Solution {
public:int maximumLengthSubstring(string s) {unordered_map<char,int> m;int n=s.size(); int left=0,ret=0;for(int right=0;right<n;right++){m[s[right]]++;while(m[s[right]]==3)  //当该字符已经出现过2次时,进行出窗口{m[s[left++]]--;}ret=max(ret,right-left+1);}return ret;}
};

1493. 删掉一个元素以后全为 1 的最长子数组

题解:控制一个区间,保证这个区间内最多存在一个0,返回这个区间中1的个数。通过滑动窗口来控制这一段区间,当0的个数大于1时进行出窗口,否则入窗口。

class Solution {
public:int longestSubarray(vector<int>& nums) {//控制一个区间,保证这个区间内最多存在一个0,返回这个区间中1的个数//还是使用滑动窗口进行解决,当0的个数超过1的时候出窗口,否则入窗口int left=0,zero=0;  //用zero记录0的个数int ret=0,n=nums.size();for(int right=0;right<n;right++){if(nums[right]==0) zero++;while(zero==2)if(nums[left++]==0) zero--;//更新答案ret=max(ret,right-left); //注意:此处1的个数是right-left,因为是闭区间所以总个数+1,//但是区间中有一个是0}return ret;}
};

1208. 尽可能使字符串相等

题解:维护一段区间保证这一区间内开销始终小于maxCost,当开销大于max的时候进行出窗口,否则继续入窗口。

class Solution {
public:int equalSubstring(string s, string t, int maxCost) {//控制一个区间,当该区间内的开销大于最大开销的时候进行出窗口,否则入窗口int left=0,n=min(s.size(),t.size());int ret=0,tmp=0;for(int right=0;right<n;right++){   tmp+=abs(s[right]-t[right]);while(tmp>maxCost){tmp-=abs(s[left]-t[left]);left++;}//更新答案ret=max(ret,right-left+1);}return ret;}
};

904. 水果成篮

题解:维护一段区间,保证这段区间种水果种类最多有2种,返回这段区间长度最大值。

class Solution {
public:int totalFruit(vector<int>& fruits) {//还是控制一段区间,保证这一区间内水果种类小于等于2即可,返回最长区间unordered_map<int ,int> m;  //存储水果数种类及个数int n=fruits.size(),left=0;int ret=0;for(int right=0;right<n;right++){m[fruits[right]]++;while(m.size()==3)   //此时说过种类有3种{m[fruits[left]]--;if(m[fruits[left]]==0) m.erase(fruits[left]);left++;}ret=max(ret,right-left+1);}return ret;}
};

1695. 删除子数组的最大得分

题解:维护一段区间,保证区间内每个元素只出现过一次。返回这段区间内元素之和的最大值。

class Solution {
public:int maximumUniqueSubarray(vector<int>& nums) {//维护一段区间,保证区间内每个元素仅出现一次,返回区间元素最大总和unordered_set<int> ss;int left=0,n=nums.size();int ret=0,tmp=0;for(int right=0;right<n;right++){while(ss.count(nums[right]))  //进行出窗口{tmp-=nums[left];ss.erase(nums[left++]);}ss.insert(nums[right]);  //入窗口tmp+=nums[right];ret=max(ret,tmp);   //调整答案}return ret;}
};

2958. 最多 K 个重复元素的最长子数组

题解:维护一段区间,保证这段区间内相同元素个数不超过k个,返回区间最长长度。

class Solution {
public:int maxSubarrayLength(vector<int>& nums, int k) {//控制一段区间,使得该区间内元素出现频率小于等于k//返回最长区间长度int left=0,n=nums.size();unordered_map<int ,int> mm;int ret=0;for(int right=0;right<n;right++){mm[nums[right]]++;//入窗口while(mm[nums[right]]>k)   //相同元素超过k个,出窗口mm[nums[left++]]--;ret=max(ret,right-left+1);}return ret;}
};

2024. 考试的最大困扰度

题解:K决定了我们可以改变的字符个数,维护一段区间,当这段区间的T或者F的个数有一个是小于K的就能够实现让区间内字符相同。当T和F的个数都大于K的时候就需要出窗口。

class Solution {
public:int maxConsecutiveAnswers(string answerKey, int k) {//维护一段区间,保证区间内T和F的个数至少有一个小于k即可int left=0,n=answerKey.size();int ret=0,Tnum=0,Fnum=0;  //分别记录T和F的个数for(int right=0;right<n;right++){if(answerKey[right]=='T') Tnum++;else Fnum++;while(Tnum>k&&Fnum>k)  //当该段区间内T和F的个数都大于K的时候就需要进行出窗口{if(answerKey[left++]=='T') Tnum--;else Fnum--;}ret=max(ret,right-left+1);}return ret;}
};

1004. 最大连续1的个数 III

题解:本题与上面的《删除一个元素以后全是1的最长子字符串》类似,不同的是此时可以通过将0修改为1来找最长子串。

class Solution {
public:int longestOnes(vector<int>& nums, int k) {//本题与上面的删除一个元素以后全是1的最长子字符串类似//本题是将K个0变成1int left=0,n=nums.size();int ret=0,zero=0;for(int right=0;right<n;right++){//入窗口if(nums[right]==0) zero++;  while(zero>k)if(nums[left++]==0) zero--;  //出窗口//更新答案ret=max(ret,right-left+1);}return ret;}
};

1658. 将 x 减到 0 的最小操作数

题解:左右两边元素之和是x----->中间部分元素之和是sum-x即可。通过将维护左右两边区间转化为维护中间部分来让滑动窗口的使用根方便自然。

class Solution {
public:int minOperations(vector<int>& nums, int x) {//需要移除左右两边的元素---->移除中间部分的元素//将题型转化为移除中间部分的元素,方便滑动窗口的使用//左右两边元素之和是x,则中间元素之和是sum-x,找到中间最长区间//计算中间部分需要的和int sum=0,n=nums.size();for(auto e:nums) sum+=e;  int mid=sum-x;if(mid<0) return -1;  //当mid小于都等于0的时候是没有区间满足条件的需要特殊处理if(mid==0) return n;//使用滑动窗口int left=0,num=0,tmp=0;for(int right=0;right<n;right++){tmp+=nums[right];while(tmp>mid)tmp-=nums[left++];if(tmp==mid) num=max(num,right-left+1);}return num==0?-1:n-num;}
};

求最短/最小

求最短长度/求最小值与最大值类型相同,仅仅是将取最大值修改为取最小值。只不过需要注意更新答案的位置应该在哪。

209. 长度最小的子数组

题解:经典的滑动窗口问题,此题需要注意的是更新答案的位置与上面的有所区别。

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {//经典的滑动窗口问题int n=nums.size();int left=0;int ret=INT_MAX,tmp=0;  //for(int right=0;right<n;right++){tmp+=nums[right];while(tmp>=target){ret=min(ret,right-left+1);tmp-=nums[left++];}  }return ret==INT_MAX?0:ret;}
};

2904. 最短且字典序最小的美丽子字符串

题解:通过滑动窗口遍历字符串,当区间中1的个数是k个就对结果进行更新并且进行出窗口操作。

class Solution {
public:string shortestBeautifulSubstring(string s, int k) {//通过滑动窗口遍历字符串,找到最小的长度且最小字典序int n=s.size();int left=0;int one=0;string ret;for(int right=0;right<n;right++){if(s[right]=='1') one++;   //入窗口while(one==k){string tmp=s.substr(left,right-left+1);  int a=ret.size(),b=tmp.size();if(a==0||a>b||(a==b&&ret>tmp)) ret=tmp;      //更新窗口if(s[left++]=='1') one--;   //出窗口}}return ret;}
};

求子数组个数

越长越合法型

滑动窗口有两层循环,当内循环结束以后恰好不满足条件,但是[left-1,right]是恰好满足的,如果将数组进一步向左边延申其都是满足的,所以可以将ret+=left当right走到下一个位置之后如果left到right区间内还是不满足,则right可以作为右边界,此时[left,right]依旧是恰好满足的当right走到下一个位置之后如果left到right区间是满足的,此时就可以对left进行更新了,让left更靠前,使得right向后的时候能够更早的与left形成恰好满足的情况。

1358. 包含所有三种字符的子字符串数目

题解:通过滑动窗口找到恰好满足条件的位置,将ret+=left即可,可以结合上面图解分析。

class Solution {
public:int numberOfSubstrings(string s) {//此题在找到恰好满足条件的数组后,对该数组进行拓展即可,越长越合法//采用滑动窗口进行实现int n=s.size(),left=0,ret=0;unordered_map<char ,int > count;  //存储各个字符出现的次数for(int right=0;right<n;right++){count[s[right]]++;while(count.size()==3){//此时的子字符串满足条件//开始找恰好满足条件的之子字符串if(--count[s[left]]==0) count.erase(s[left]);left++;}//此时已经不满足条件了,但是left的上一次还是满足的//所以[left-1,right]区间内是恰好满足的字符串,将left-1向左拓展依旧是满足的//所以可以将ans+=left  ret+=left;               }return ret;}
};

2962. 统计最大元素出现至少 K 次的子数组

题解:与上一题相同,还是找恰好满足的情况。

class Solution {
public:long long countSubarrays(vector<int>& nums, int k) {//先找到最大元素,再进行滑动窗口找恰好满足的位置int themax=INT_MIN;for(auto e:nums)if(e>themax) themax=e;int count=0; //统计最大元素的个数int n=nums.size(),left=0;long long ret=0;for(int right=0;right<n;right++){if(nums[right]==themax) count++;  while(count==k)if(nums[left++]==themax) count--;  //出窗口ret+=left;  //更新答案}return ret;}
};

3325. 字符至少出现 K 次的子字符串 I

题解:使用map对每个字符进行统计,还是找恰好满足的情况。

class Solution {
public:int numberOfSubstrings(string s, int k) {//有一个字符至少出现K次,还是找恰好满足的情况unordered_map<char ,int > mm; //统计各个字符出现的次数int ret=0;int n=s.size(),left=0;for(int right=0;right<n;right++){mm[s[right]]++;  //进窗口while(mm[s[right]]==k)mm[s[left++]]--;  //出窗口ret+=left;  //更新答案}return ret;}
};

2799. 统计完全子数组的数目

题解:子数组中不同元素的数目等于整个数组不同元素的数目----->子数组中至少包含nums中不同元素中的一个。所以此处就转化为了"越长越合法型",向前找都是合法的。

class Solution {
public:int countCompleteSubarrays(vector<int>& nums) {//题目要求子数组中不同元素的数目等于数组中不同元素的数目//这就意味着子数组中包含nums所有种类的数字至少一个//还是找恰好满足条件的情况//向统计nums中存在多少个不同的元素unordered_map<int,int> count;for(auto e:nums) count[e]++;int differ=count.size();//进行滑动窗口unordered_map<int,int> mm;int n=nums.size();int ret=0,left=0;for(int right=0;right<n;right++){mm[nums[right]]++;   //入窗口while(mm.size()==differ){if(--mm[nums[left]]==0) mm.erase(nums[left]);  //出窗口left++;         }ret+=left;  //更新答案}return ret;}
};

越短越合法型

与越长越合法型恰好相反,此题是越短越合法。滑动窗口的内存循环用于解决不满足条件的区间,在外层循环中直接对答案进行更新,在外层循环中[left,right]是满足条件的,那以right为终点,[left+1,right],[left+2,right],[left+2,right].......[right-1,right],[right,right]都是满足条件的,所以直接将ret+=right-left+1即可。因为righ是一直在向后面走的,所以不会出现重复的区间。

713. 乘积小于 K 的子数组

class Solution {
public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {//越短越合法if(k<=1) return 0;int left=0,n=nums.size();int ret=0;long long tmp=1;for(int right=0;right<n;right++){tmp*=nums[right];   //入窗口while(tmp>=k)//不满足条件      tmp/=nums[left++];  //出窗口ret+=right-left+1; //更新答案}return ret;}
};

3258. 统计满足 K 约束的子字符串数量 I

题解:依旧是越短越合法型,通过内循环解决不满足条件的情况,在对ret进行更新即可。

class Solution {
public:int countKConstraintSubstrings(string s, int k) {//越短越符合条件int zero=0,one=0;int ret=0,left=0,n=s.size();for(int right=0;right<n;right++){if(s[right]=='1') one++;  //入窗口else zero++;while(zero>k&&one>k){if(s[left]=='1') one--;  //出窗口else zero--;left++;}ret+=right-left+1;  //更新答案}return ret;}
};

2302. 统计得分小于 K 的子数组数目

题解:区间越小越满足条件,符合越短越合法模型。

class Solution {
public:long long countSubarrays(vector<int>& nums, long long k) {//子数组的长度越小越满足条件int n=nums.size();int left=0;long long tmp=0,ret=0;for(int right=0;right<n;right++){tmp+=nums[right];  //入窗口while(tmp*(right-left+1)>=k){tmp-=nums[left++];  //进行出窗口}ret+=right-left+1;   //更新答案}return ret;}
};

LCP 68. 美观的花束

题解:先找到一个满足条件的区间,对该区间进行缩小所得到的子区间依旧是满足条件的。

class Solution {#define MOD 1000000007
public:int beautifulBouquet(vector<int>& flowers, int cnt) {//找到一个满足的区间,将该区间进行缩小得到的所有子区间也是同样满足条件的int n=flowers.size();int left=0,ret=0;unordered_map<int ,int> mm;for(int right=0;right<n;right++){mm[flowers[right]]++;  //入窗口while(mm[flowers[right]]>cnt)   mm[flowers[left++]]--; ///出窗口ret=(ret+right-left+1)%MOD;  //更新答案}return ret;}
};

恰好型滑动窗口

与前两个不同的是此时是恰好满足,比如要求找一个子数组的长度恰好等于K的数组个数,可以转化长度长度>=K的数组个数减去长度>=K+1的数组个数,或者是转化为长度<=K的数组个数减去长度<=K+1的数组个数来实现。关于恰好型滑动窗口的关键在于将其转化为越短越合法型或越长越合法型。

930. 和相同的二元子数组

题解:对题意进行转化,将等于goal的条件转化为大于等于goal的个数减去大于等于goal-1的个数即可,或者转化为小于等于goal的个数减去大于等于goal的个数即可。下面题解采用第二种进行代码实现。

class Solution {
public://找小于等于k的数组个数int numMore(vector<int> nums,int k){int n=nums.size();int left=0,tmp=0;int ret=0;for(int right=0;right<n;right++){tmp+=nums[right];   //进窗口while(left<=right&&tmp>k) tmp-=nums[left++];  //出窗口ret+=right-left+1;  //更新答案}return ret;}int numSubarraysWithSum(vector<int>& nums, int goal) {return numMore(nums,goal)-numMore(nums,goal-1);}
};

1248. 统计「优美子数组」

题解:将恰好转化为至少或者是至多来间接解决。

class Solution {
public://恰好有K个奇数的子数组个数=大于等于K个奇数的子数组个数-大于等于K+1个奇数的子数组个数int numMore(vector<int>& nums,int pos){int n=nums.size(),left=0;int ret=0,odd=0;for(int right=0;right<n;right++){if(nums[right]%2==1) odd++;  //进窗口while(left<=right&&odd>=pos) if(nums[left++]%2==1) odd--;   //出窗口ret+=left;  //更新答案}return ret;}int numberOfSubarrays(vector<int>& nums, int k) {return numMore(nums,k)-numMore(nums,k+1);}
};

3306. 元音辅音字符串计数 II

题解:恰好有k个辅音字母的个数==大于等于k个辅音字母的个数-大于等于k+1个辅音字母的个数。通过哈希表来记录区间中元音字符的种类和个数,再使用一个变量来统计区间内辅音字符的个数即可。

class Solution {unordered_set<char> vowel;  //记录元音
public://恰好包含K个辅音==至少包含K个辅音-至少包含K+1个辅音long long numMore(string str,int pos){unordered_map<char ,int> num;  //记录区间中元音的类型及个数int n=str.size(),left=0;int conson=0;  //记录辅音的个数long long ret=0;for(int right=0;right<n;right++){if(vowel.count(str[right])) num[str[right]]++;  //进窗口else conson++;while(left<=right&&num.size()==5&&conson>=pos){if(vowel.count(str[left]))    //出窗口{if(--num[str[left]]==0) num.erase(str[left]);}else conson--;left++;}ret+=left;  //更新答案}return ret;}long long countOfSubstrings(string word, int k) {vowel={'a','e','i','o','u'};return numMore(word,k)-numMore(word,k+1);}
};

992. K 个不同整数的子数组

题解:恰好有k个整数不同的个数==有大于等于k个不同整数的个数-有大于等于k+1个不同整数的个数。

class Solution {
public://不同整数的个数恰好为K=不同整数的个数大于等于K-不同整数的个数大于等于K+1int numMore(vector<int>& nums,int pos){unordered_map<int ,int> mm;int left=0;int n=nums.size(),ret=0;for(int right=0;right<n;right++){mm[nums[right]]++;     //进窗口while(mm.size()>=pos){if(--mm[nums[left]]==0) mm.erase(nums[left]);   //出窗口left++;  }ret+=left;   //更新答案}return ret;}int subarraysWithKDistinct(vector<int>& nums, int k) {return numMore(nums,k)-numMore(nums,k+1);}
};

加餐

1438. 绝对差不超过限制的最长连续子数组

题解:通过map对nums中最大值和最小值的记录来判断是不是合理区间。

class Solution {
public:int longestSubarray(vector<int>& nums, int limit) {//使用滑动窗口来控制区间[left,right]map<int,int> mm;int n=nums.size(),left=0;int ret=0;for(int right=0;right<n;right++){mm[nums[right]]++;  //进窗口while(mm.rbegin()->first-mm.begin()->first>limit){if(--mm[nums[left]]==0) mm.erase(nums[left]);  //出窗口left++;}ret=max(ret,right-left+1);  //更新答案}return ret;}
};

2401. 最长优雅子数组

题解:使用滑动窗口来记录一个区间中二进制的总和(通过|来确定),再进行按位与&判断是否为0;此题的关键在于二进制的增加和删除。通过|将二进制位进行整合,通过^将不符合要求的二进制进行删除。

class Solution {
public://将每一个数字的每一个二进制位记录下来,当一个二进制位已经存在时就说明不满足条件int longestNiceSubarray(vector<int>& nums) {int n=nums.size(),ret=0;int left=0,tmp=0;for(int right=0;right<n;right++){while(tmp&nums[right]) tmp^=nums[left++];   //出窗口,通过^实现将前面数字的二进制移除tmp|=nums[right];      //入窗口,通过|将当前数字的二进位加入ret=max(right-left+1,ret);//更新答案}return ret;}
};

438. 找到字符串中所有字母异位词

题解:通过控制一段长度与p长度相等的区间来判断区间是否满足题意即可。

class Solution {
public:vector<int> findAnagrams(string s, string p) {//使用滑动窗口,判断当前区间中的字符个数是否与目标字符串个数相同char tar[128]={0};  //存储p中字符的种类及个数int num=0;  //存储p中不同字符的个数for(auto e:p) if(tar[e]++==0) num++;vector<int> ret;int n=s.size(),left=0,same=0;char ch[128]={0};   //存储区间中字符的种类及个数for(int right=0;right<n;right++){if(++ch[s[right]]==tar[s[right]]) same++;if(right-left+1==p.size())  //当区间长度与p的长度相等时进行判断{if(same==num) ret.push_back(left);if(ch[s[left]]==tar[s[left]]) same--; ch[s[left++]]--;}}return ret;}
};

总结

不定长滑动窗口就是根据题目确定条件来对窗口进行控制,还是采用:进窗口---更新答案---出窗口的三个步骤。

文章题目内容很长,感谢阅读。

相关文章:

不定长滑动窗口---初阶篇

目录 引言 求最长/最大 3. 无重复字符的最长子串 3090. 每个字符最多出现两次的最长子字符串 1493. 删掉一个元素以后全为 1 的最长子数组 1208. 尽可能使字符串相等 904. 水果成篮 1695. 删除子数组的最大得分 2958. 最多 K 个重复元素的最长子数组 2024. 考试的最大…...

MacOS 上构建 gem5

MacOS 中只存在 python3&#xff0c;但是scons 只认 python&#xff0c;不在 系统中创建 软连接&#xff0c;一个是因为比较难操作&#xff1b;另一个是尽量不要更改系统。所以独立构件python 和scons&#xff1a; 1&#xff0c;安装python 下载源代码&#xff1a; Python S…...

矩阵置零算法讲解

矩阵置零算法讲解 一、问题描述 给定一个 (m \times n) 的矩阵,如果一个元素为 (0) ,则将其所在行和列的所有元素都设为 (0) 。要求使用原地算法,即在不使用额外矩阵空间的情况下完成操作。 二、解题思路 暴力解法 最直观的想法是遍历矩阵,当遇到 (0) 元素时,直接将其…...

HAProxy + Keepalived + Nginx 高可用负载均衡系统

1. 项目背景 在现代Web应用中&#xff0c;高可用性和负载均衡是两个至关重要的需求。本项目旨在通过HAProxy实现流量分发&#xff0c;通过Keepalived实现高可用性&#xff0c;通过Nginx提供后端服务。该架构能够确保在单点故障的情况下&#xff0c;系统仍然能够正常运行&#…...

火山RTC 6 自定义视频

文档&#xff1a; 自定义视频采集--实时音视频-火山引擎 这个点&#xff0c;相关的文档 关于PC上的资料只有寥寥几句&#xff0c;没有代码、没有DEMO&#xff0c;自己琢磨了几天&#xff0c;没走对方向&#xff0c;和客服你来我往拉锯了几天加投诉下&#xff0c;才给了点内部…...

[Java][Leetcode middle] 121. 买卖股票的最佳时机

暴力循环 总是以最低的价格买入&#xff0c;以最高的价格卖出: 例如第一天买入&#xff0c;去找剩下n-1天的最高价格&#xff0c;计算利润 依次计算到n-1天买入&#xff1b; 比较上述利润 // 运行时间超时。 o(n^2)public int maxProfit1(int[] prices) {int profit 0;for (i…...

《数据结构初阶》【堆 + 堆排序 + TOP-K】

【堆 堆排序 TOP-K】目录 前言&#xff1a;什么是堆&#xff1f;堆的实现方式有哪些&#xff1f;我们要选择哪种方式进行实现&#xff1f; ----------------堆的实现----------------什么是向上调整算法&#xff0c;要怎么实现&#xff1f;什么是向下调整算法&#xff0c;要怎…...

sqlilab-Less-18

知识铺垫 User-Agent 首部包含了一个特征字符串&#xff0c;用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。user-agent的作用。通过识别用户身份&#xff0c;响应合适的web界面&#xff0c;所以更改可以让电脑返回一个手机界…...

mapbox进阶,使用mapbox-plugins插件加载饼状图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀使用mapbox-plugins插件加载饼状图1. ☘…...

【Java继承】——面向对象编程的基石

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 【前言】 在Java面向对象编程中&#xff0c;继承是一个非常重要的概念。它允许我们创建一个新类&…...

【数据结构】——队列

一、队列的概念和结构 概念&#xff1a; 只允许在⼀端进⾏插⼊数据操作&#xff0c;在另⼀端进⾏删除数据操作的特殊线性表&#xff0c;队列具有先进先 出FIFO(First In First Out)。 入队&#xff1a;进行数据插入的一端叫做队尾 出队&#xff1a;进行删除操作的一端叫做队…...

如何找出所有不重复的三位偶数:详细解法与思考过程

问题描述 给定一个包含数字&#xff08;0-9&#xff09;的数组digits&#xff0c;其中可能包含重复元素。我们需要找出所有满足以下条件且互不相同的整数&#xff1a; 该整数由digits中的三个元素按任意顺序依次连接组成 该整数不含前导零&#xff08;即必须是100-999之间的数…...

每日Prompt:超现实交互场景

提示词 一幅铅笔素描画&#xff0c;描绘了 一个女孩 与 一朵玫瑰 互动的场景&#xff0c;其中 一朵玫瑰 以逼真的全彩风格呈现&#xff0c;与 一个女孩及背景的手绘素描风格形成超现实的对比。...

基于大模型预测的多发性硬化综合诊疗方案研究报告大纲

目录 一、引言二、文献综述三、大模型预测系统构建四、术前预测与手术方案制定五、术中监测与决策支持六、术后护理与并发症预测七、麻醉方案智能优化八、统计分析与技术验证九、实验验证与证据支持十、健康教育与指导系统十一、结论与展望一、引言 (一)研究背景与意义 多发…...

五、Hive表类型、分区及数据加载

在 Hive 中高效构建、管理和查询数据仓库&#xff0c;核心在于精准运用表类型&#xff08;内部/外部&#xff09;与分区策略&#xff08;静态/动态/多重&#xff09;。这不仅决定数据的生命周期归属&#xff0c;更是优化海量数据查询性能的关键手段。 一、表的身份权责&#x…...

在选择合适的实验室铁地板和铸铁试验平板,帮分析​

铸铁测试底板是一种采用铸铁材料经过加工制成的基准测量工具&#xff0c;主要用于工业检测、机械加工和实验室等高精度要求的场合。其核心功能是为各类测量、检验、装配工作提供稳定的水平基准面&#xff0c;确保测量数据的准确性和一致性。 一、铸铁测试底板的基本特性 1.材质…...

阿里云人工智能大模型通义千问Qwen3开发部署

本文主要描述阿里云人工智能大模型开源社区ModelScope提供的通义千问Qwen3开发部署。 与阿里云一起 轻松实现数智化 让算力成为公共服务&#xff1a;用大规模的通用计算&#xff0c;帮助客户做从前不能做的事情&#xff0c;做从前做不到的规模。让数据成为生产资料&#xff1a;…...

网络基础知识梳理和Muduo库使用

文章目录 网络基础知识梳理和Muduo库使用1.知识储备2.阻塞、非阻塞、同步、异步我的总结 3.Unix/Linux上的五种IO模型0.铺垫1.阻塞IO&#xff08;blocking&#xff09;2.非阻塞IO&#xff08;non-blocking&#xff09;3.IO复用&#xff08;IO multiplexing&#xff09;4.信号驱…...

IDEA 插件推荐:提升编程效率

通过安装和使用合适的插件&#xff0c;可以大幅提升开发效率和代码质量。本文将从多个维度推荐实用的 IDEA 插件&#xff0c;并提供安装与使用指南。 一、代码辅助类插件 1. Key Promoter X —— 快捷键学习利器 功能介绍&#xff1a;当你使用鼠标点击某个功能时&#xff0c;…...

001大模型-认识大模型以及大模型应用场景

大模型是一种基于海量数据训练的人工智能系统&#xff0c;具备强大的语言理解和生成能力。其工作原理是通过深度学习算法&#xff0c;分析大量文本数据&#xff0c;学习语言模式和知识&#xff0c;从而能够处理复杂的任务。大模型的应用广泛&#xff0c;包括自然语言处理、机器…...

Qt进阶开发:QTcpServer的的详解

文章目录 一、QTcpServer 简介二、常用成员函数的使用三、信号函数的使用四、虚函数的使用五、连接多客户端-服务端示例一、QTcpServer 简介 QTcpServer 是 Qt 网络模块中的一个核心类,用于实现 基于 TCP 协议的服务端(Server),它负责监听端口、接收客户端连接请求,并通过…...

Spark,集群搭建之Yarn模式

以下是Spark基于Yarn模式的集群搭建关键步骤&#xff08;需先部署Hadoop Yarn集群&#xff09;&#xff1a; 一、环境准备 1. 确认Hadoop已运行 - 确保HDFS、Yarn ResourceManager和NodeManager正常启动。 2. 安装Java - 所有节点安装JDK 8&#xff0c;配置 JAVA_HOME 环境变量…...

fiddler 配置ios手机代理调试

平时做移动移动端开必的时候经常需要抓包手机&#xff0c;用于接口请求跟踪&#xff0c;但iOS的抓包经常性的配不成功&#xff0c;经过踩过不少坑后终于知道了整个配置流程&#xff0c;此文记录Fiddler抓包iOS手机的配置流程。 Step 1&#xff1a;Fiddler配置 通过工具栏Tool…...

iOS即时通信的技术要点

iOS即时通信开发的关键技术要点总结&#xff1a; 一、通讯协议选择 Socket通信 基础实现&#xff1a;使用原生BSD Socket或CFNetwork框架&#xff08;复杂&#xff09;&#xff0c;推荐第三方库如CocoaAsyncSocket&#xff08;封装GCDAsyncSocket&#xff09;&#xff0c;简化T…...

Windows 安装 Milvus

说明 操作系统&#xff1a;Window 中间件&#xff1a;docker desktop Milvus&#xff1a;Milvus Standalone&#xff08;单机版&#xff09; 安装 docker desktop 参考&#xff1a;Window、CentOs、Ubuntu 安装 docker-CSDN博客 安装 Milvus 参考链接&#xff1a;Run Mil…...

5G网络:能源管理的“智能电网“革命,Python如何成为关键推手?

5G网络&#xff1a;能源管理的"智能电网"革命&#xff0c;Python如何成为关键推手&#xff1f; 大家好&#xff0c;我是Echo_Wish。今天咱们聊一个既硬核又接地气的话题——5G网络如何用Python代码重构全球能源管理。 不知道你们有没有注意过&#xff1a; • 家里装…...

解决WSL、Ubuntu的.ico图标不正确显示缩略图

解决WSL、Ubuntu的.ico图标不正确显示缩略图 问题描述 Win10系统中由于更新了某些软件&#xff0c;篡改了默认的图像显示软件&#xff0c;导致WSL等软件未能成功显示图标&#xff0c;表现如下&#xff1a; 解决方法 将ico文件的默认打开方式更改为“画图”&#xff0c;如下…...

Redis+Caffeine构造多级缓存

一、背景 项目中对性能要求极高&#xff0c;因此使用多级缓存&#xff0c;最终方案决定是RedisCaffeine。其中Redis作为二级缓存&#xff0c;Caffeine作为一级本地缓存。 二、Caffeine简单介绍 Caffeine是一款基于Java 8的高性能、灵活的本地缓存库。它提供了近乎最佳的命中…...

Redis+Caffeine构建高性能二级缓存

大家好&#xff0c;我是摘星。今天为大家带来的是RedisCaffeine构建高性能二级缓存&#xff0c;废话不多说直接开始~ 目录 二级缓存架构的技术背景 1. 基础缓存架构 2. 架构演进动因 3. 二级缓存解决方案 为什么选择本地缓存&#xff1f; 1. 极速访问 2. 减少网络IO 3…...

【机器人】复现 UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025

UniGoal的提出了一个通用的零样本目标导航框架&#xff0c;能够统一处理多种类型的导航任务。 支持 对象类别导航、实例图像目标导航和文本目标导航&#xff0c;而无需针对特定任务进行训练或微调。 本文分享UniGoal复现和模型推理的过程&#xff5e; 查找沙发&#xff0c;模…...

LeetCode 373 查找和最小的 K 对数字题解

LeetCode 373 查找和最小的 K 对数字题解 题目描述 给定两个以升序排列的整数数组 nums1 和 nums2&#xff0c;以及一个整数 k。定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2。请找到和最小的 k 个数对。 解题思路 最小堆优化法…...

搜索二维矩阵 II 算法讲解

搜索二维矩阵 II 算法讲解 一、问题描述 给定一个 m x n 的二维矩阵 matrix ,需要在其中搜索一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。要求编写一个高效的算法来完成搜索任务。 二、解题思路 方法一:暴力枚举 …...

三层交换机,单臂路由(用DHCP自动配置ip+互通+ACL

三层交换机&#xff0c;单臂路由&#xff08;用DHCP自动配置ip互通ACL 任务 1.用DHCP自动配置ip 2.三层交换机SVI、 3.单臂路由 4.互通 5.ACL三层交换机SVI 交换机 Switch>en Switch#conf t Enter configuration commands, one per line. End with CNTL/Z. Switch(conf…...

OpenCV CUDA 模块中在 GPU 上对图像或矩阵进行 翻转(镜像)操作的一个函数 flip()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::flip 是 OpenCV 的 CUDA 模块中的一个函数&#xff0c;用于在 GPU 上对图像或矩阵进行 翻转&#xff08;镜像&#xff09;操作。它类似…...

链表面试题7之相交链表

来了来了&#xff0c;这道题才是值得我们奇思妙想的题,链接在下面。 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 看完题目一脸懵吗&#xff0c;没关系&#xff0c;我们还得看示例 还是一脸懵怎么办&#xff1f;&#xff1f; 两个链表相交的方式有几种&#xff1f;…...

Excel-to-JSON插件专业版功能详解:让Excel数据转换更灵活

前言 在数据处理和系统集成过程中&#xff0c;Excel和JSON格式的转换是一个常见需求。Excel-to-JSON插件提供了一套强大的专业版功能&#xff0c;能够满足各种复杂的数据转换场景。本文将详细介绍这些专业版功能的应用场景和使用方法。 订阅说明 在介绍具体功能之前&#xf…...

【C++】”如虎添翼“:模板初阶

泛型编程&#xff1a; C中一种使用模板来实现代码重用和类型安全的编程范式。它允许程序员编写与数据类型无关的代码&#xff0c;从而可以用相同的代码逻辑处理不同的数据类型。模板是泛型编程的基础 模板分为两类&#xff1a; 函数模板&#xff1a;代表了一个函数家族&#x…...

【K8S学习之探针】详细了解就绪探针 readinessProbe 和存活探针 livenessProbe 的配置

参考 Pod健康检查 Kubernetes 学习笔记Kubernetes 就绪探针&#xff08;Readiness Probe&#xff09; - 人艰不拆_zmc - 博客园Kubernetes存活探针&#xff08;Liveness Probe&#xff09; - 人艰不拆_zmc - 博客园 Pod健康检查 Pod的健康状态由两类探针来检查&#xff1a;…...

WSL 安装 Debian 12 后,Linux 如何安装 redis ?

在 WSL 的 Debian 12 上安装 Redis 的步骤如下&#xff1a; 1. 更新系统包列表 sudo apt update && sudo apt upgrade -y2. 安装 Redis sudo apt install redis-server -y3. 启动 Redis 服务 sudo systemctl start redis4. 设置开机自启 sudo systemctl enable red…...

python打卡day22

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 就是很简单很草率地走了一遍机器学习的经典流程&am…...

国产化Excel处理控件Spire.XLS系列教程:如何通过 C# 删除 Excel 工作表中的筛选器

在 Excel 文件中&#xff0c;筛选器&#xff08;Filter&#xff09;是一个常用的数据处理工具&#xff0c;可以帮助用户快速按条件筛选数据行。但在数据整理完成、导出、共享或打印之前&#xff0c;往往需要 删除 Excel 工作表中的筛选器&#xff0c;移除列标题中的下拉筛选按钮…...

使用 DMM 测试 TDR

TDR&#xff08;时域反射计&#xff09;可能是实验室中上升时间最快的仪器&#xff0c;但您可以使用直流欧姆表测试其准确性。 TDR 测量什么 在所有高速通道中&#xff0c;反射都很糟糕。我们尝试设计一个通道来减少反射&#xff0c;这些反射都会导致符号间干扰 &#xff08;…...

基于卡尔曼滤波的传感器融合技术的多传感器融合技术(附战场环境模拟可视化代码及应用说明)

基于卡尔曼滤波的传感器融合技术的多传感器融合技术(附战场环境模拟可视化代码及应用说明) 1 目标运动状态空间建模1.1 状态向量定义1.2 状态转移方程1.3 观测模型构建2 卡尔曼滤波核心算法实现2.1 初始化2.2 预测步骤2.3 更新步骤3 多传感器融合仿真验证3.1 传感器模型模拟3…...

M8040A/M8199助力数据中心收发信机测试

随着数字通信和大数据的不断发展&#xff0c;误码率测试变得越来越重要。高性能误码率测试仪作为一种关键的测试设备&#xff0c;可以对数字信号进行高速、高精度的误码率测试&#xff0c;广泛应用于通信、数据中心、半导体等行业。 M8040A误码仪系统当前不仅在上游IP和顶层芯…...

傲云源墅:以五傲价值重构北京主城别墅格局

在高端别墅市场中&#xff0c;产品自身的品质与特色是吸引客户的关键。北京傲云源墅以其独特的 “五傲” 价值&#xff0c;重新定义了北京主城别墅的标准。 首先是低密之傲&#xff0c;傲云源墅的容积率低至约 0.9&#xff0c;与市场上 1.0 以上容积率的别墅相比&#xff0c;为…...

精益数据分析(56/126):创业阶段的划分与精益数据分析实践

精益数据分析&#xff08;56/126&#xff09;&#xff1a;创业阶段的划分与精益数据分析实践 在创业和数据分析的探索之旅中&#xff0c;理解创业阶段的划分以及与之对应的精益数据分析方法至关重要。今天&#xff0c;依旧怀揣着与大家共同进步的心态&#xff0c;深入研读《精…...

[redis进阶六]详解redis作为缓存分布式锁

目录 一 什么是缓存 缓存总结板书: 二 使⽤Redis作为缓存 三 缓存的更新策略 1) 定期⽣成 2) 实时⽣成 四 面试重点:缓存预热,缓存穿透,缓存雪崩 和缓存击穿 1)缓存预热 2)缓存穿透 3)缓存雪崩 4)缓存击穿 五 分布式锁 板书: 1)什么是分布式锁 2)分布式锁的基…...

【RabbitMQ】应用问题、仲裁队列(Raft算法)和HAProxy负载均衡

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、幂等性保障 什么是幂等性&#xff1f; 幂等性是指对一个系统进行重复调用&#xff08;相同参数&#xff09;&#xff0c;无论同一操作执行多少次&#xff0c;这些请求…...

国产密码新时代!华测国密 SSL 证书解锁安全新高度

在数字安全被提升到国家战略高度的今天&#xff0c;国产密码算法成为筑牢网络安全防线的关键力量。华测国密SSL证书凭借其强大性能与贴心服务&#xff0c;为企业网络安全保驾护航&#xff0c;成为符合国家安全要求的不二之选&#xff01;​ 智能兼容&#xff0c;告别浏览器适配…...

【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)

本篇文章将以一个小白视角&#xff0c;通俗易懂带你了解信号在产生&#xff0c;保存之后如何进行捕捉&#xff1b;以及在信号这个话题中&#xff1b;OS扮演的角色及背后是如何进行操作的&#xff1b;如何理解用户态内核态&#xff1b;还有一些可以引出的其他知识点&#xff1b;…...