数据结构-滑动窗口三题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、第一题
- 二、第二题
- 三、第三题
- 总结
前言
相比于网上的题解我的会更丑,但也会更细,毕竟是新手
一、第一题
第一题没什么好说的,为了熟悉还是看了题解
class Solution {public int lengthOfLongestSubstring(String s) {Set<Character> set1=new HashSet<>();int ans=0,rk=-1;//rk是右针int n=s.length();//[0,n-1]for(int i=0;i<n;i++){//拿掉一个左指针,第一次则忽略if(i!=0){set1.remove(s.charAt(i-1));}//不越界;把if写在上面做判断;第一次从这里开始,rk+1是右针的nextwhile(rk+1<n && !set1.contains(s.charAt(rk+1))){//不包含下一个字符set1.add(s.charAt(rk+1));++rk;}ans=Math.max(ans,rk+1-i);}return ans;}
}
二、第二题
第二题也没什么好说的,看了一下没有思路,还是去看题解
这个时候已经在总结了
这里的思路是:
以10个字符长度去滑动,得到的数组记在List中,但是怎么去计数和判断重复还是不清楚,看了别人的评论说可以创建两个数组,数组1collection放第一次出现的,如果数组1中已存在就放入数组2visited,数组2就是答案。想不到的原因还是写得少了,看到python想到了字典,没有想到java的map也有key、value。不过相对来说java的map确实比python的dict要复杂很多!!
class Solution {public List<String> findRepeatedDnaSequences(String s) {Set<String> set1=new HashSet<>();List<String> ans=new ArrayList<>();int n=s.length(),L=10;//左指针放到循环中,右指针依赖左指针for(int i=0;i<n-L+1;i++){//左指针从零开始,右指针从L-1开始String s1=s.substring(i,i+L);//这里我还犹豫了一下怎么取,实际上substring要比charAt简单,所以这题应该比上一题简单。if(set1.contains(s1) && !ans.contains(s1)){ans.add(s1);}else{set1.add(s1);} }return ans; }
}
这个也是看的题解,但是不是官方的题解,是个人的;官方题解说可以用int32位来计数,这个还是见仁见智吧,我脑袋里面没有利用位的思维,那就没必要尝试去记,强行记了也不是自己的。
三、第三题
看了两题第三题就写出来了,不过花了1个半小时
这一题比较经典,以前记得看到过很多次
先贴代码后面解释
class Solution {//滑动窗口public int minSubArrayLen(int target, int[] nums) {int n=nums.length,ans=0;//1for(int i=0;i<n;i++){//2int rk=i-1,sum=0,temp=0;//3while(rk+1<n && sum<target){//4sum+=nums[rk+1];//5rk++;//6}//7if(sum<target){//8break;//9}//10temp=rk-i+1;//11if(ans==0){//12ans=temp;//13}//14if(temp!=0){//15ans=Math.min(ans,temp);//16}//17}//18 return ans;//19}//20
}//21
写了很久,好看的还没有写出来,估计也不会写了,就这样吧。
首先肯定是写for循环,顺能生巧,第3行开始就开始写错了,rk写的是等于i,rk为什么不能写成i要写成i-1呢?因为写成i,rk++就不好摆,放在sum+的前面后面都不对,执行完了后会和i多一个步差出来,所以rk一定要等于i-1,在左指针的前面,这样测试用例一个数就满足的不会往后多走一步(其实ans等于1就已经可以返回了,因为不可能比1更小)。测试用例[1,4,4]就是这个问题,第三个测试用例是所有加起来达不到target,这个时候也可以先返回了,对应的是8、9的判断。11、12、13行是因为ans如果等于min(ans,rk-i+1)就会一直等于0,这里还没想好怎么处理,就用temp接收,后面的赋值同理,因为至少要赋值一次ans才不等于0.
至于过程中出现的越界问题和范围写错了本来也很想写一下的,但是记不住了,这个都是调试可以解决的,可以在本地自己debug,感觉要是能debug的话,很多算法都可以写出来。
总结
重点在第三题,因为是自己写的,所以感悟也最深。
滑得动则滑,滑不动就干别的了,主要是为了面试准备,并不是专职数据结构的。