Java力扣---滑动窗口(2)

209. 长度最小的子数组 - 力扣(LeetCode)

分析:这个题目是在滑动窗口题目的类似题目中的,所以最开始就是准备用滑动窗口来做的

这里用到了滑动窗口的先进先出,但是要用数字和sum做更新,所以我想到了队列 ,但是在做题目的时候,因为不知道队列可以有多长,所以要用left和right来记录队列的开始和结束


注意1:我们只需要直到队列的开始元素和结束元素的下标,并不需要直到中间存储的数据,换句话说,中间的所有数据的下标都是要放在队列之中的,是连续的,所以并不需要队列,只需要记录first和last就好了


注意2:既然用到了left和right,那么就不用使用队列了,在写的代码里,队列是完全没用到的的------所以,写完代码要重新再看一遍,是不是有冗余的部分存在

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //Deque<Integer> queue = new ArrayDeque<>();
        int sum=0;
        int left=0,right=0;
        boolean flag=true;
        int ans=nums.length+1;
        while(right<nums.length){
            while(sum<target && right<nums.length){
                //queue.addLast(right);
                sum+=nums[right];
                right++;
            }
            while(sum>=target){
                flag=false;
                //queue.removeFirst();
                sum-=nums[left];
                left++;
            }
            ans=Math.min(ans,right-left+1);
        }
        if(flag) ans=0;
        return ans;
    }
}

76. 最小覆盖子串 - 力扣(LeetCode)

分析:这个题是上一题的延申

1.要注意到可能有重复的字母,所以这里要单独分析

2.这里也是滑动窗口,但是并不需要用到队列,这里和上一题是一样的

3.这里只考虑字母出现了没有,并不考虑出现的顺序

--->这个解法很巧的一个思路是用次数,出现了几次来判断,这样子既可以判断有没有包含所有的,又可以巧妙地化解重复字符的问题

4.因为其中涉及到判断是否现在的子串满足条件,这个判断要多次出现,所以可以写成方法

5.这里的一个小巧思就是用字符的ASCII码 来做字符的判断,这样就可以用数组 了,我最开始想到的是用map来做,但是map会更麻烦很多,要考虑到是否存在,存在了再取出值加一,删除的时候也要取出值-1

java 复制代码
class Solution {
    public String minWindow(String s, String t) {
    int[] tarr=new int[128];
        int[] sarr=new int[128];

        String sub=s;
        for(char c:t.toCharArray()){
            tarr[c]++;
        }
        boolean flag=true;
        int left=0,right=0;
        while(right<s.length()){
            while (iscontened(tarr,sarr))
            {
                if(sub.length()> right-left){
                    sub=s.substring(left,right);
                }
                flag=false;
                sarr[s.charAt(left)]--;
                left++;
            }
            while (!iscontened(tarr,sarr) &&right<s.length()){
                sarr[s.charAt(right)]++;
                right++;
            }

        }
        while (iscontened(tarr,sarr) && left<s.length())
        {
            if(sub.length()> right-left){
                sub=s.substring(left,right);
            }
            flag=false;
            sarr[s.charAt(left)]--;
            left++;
        }
        if(flag) return "";
        return sub;


    }
    public static boolean iscontened(int[] tarr,int[] sarr){
        for (int i = 0; i < tarr.length; i++) {
            if(tarr[i]>sarr[i]){
                return false;
            }
        }
        return true;
    }


}

这是用map做的代码,运行时间会高很多

1.contained遍历的时候一定是用tmap遍历的,而且要考虑不存在的情况

2.在存放的时候,要分开考虑已经有的键和还没有的键

java 复制代码
class Solution {
    public String minWindow(String s, String t) {
         Map<Character, Integer> tmap = new HashMap<>();
        Map<Character, Integer> smap = new HashMap<>();
        String sub=s;
        for(char c:t.toCharArray()){
            if(tmap.containsKey(c)){
                tmap.put(c,tmap.get(c)+1);
            }else{
                tmap.put(c,1);
            }
        }
        boolean flag=true;
        int left=0,right=0;
        char c;
        while(right<s.length()){
            while (iscontened(tmap,smap))
            {
                if(sub.length()> right-left){
                    sub=s.substring(left,right);
                }
                flag=false;
                c=s.charAt(left);
                if(smap.containsKey(c)){smap.put(c,smap.get(c)-1);}
                left++;
            }
            while (!iscontened(tmap,smap) && right<s.length()){
                c=s.charAt(right);
                if(smap.containsKey(c)){smap.put(c,smap.get(c)+1);}
                else{smap.put(c,1);}
                right++;
            }
        }
        while (iscontened(tmap,smap) && left<s.length())
        {
            if(sub.length()> right-left){
                sub=s.substring(left,right);
            }
            flag=false;
            c=s.charAt(left);
            if(smap.containsKey(c)){smap.put(c,smap.get(c)-1);}
            left++;
        }
        if(flag) return "";
        return sub;
    }
    public static boolean iscontened(Map<Character,Integer> tmap,Map<Character,Integer> smap) {
        for (Map.Entry<Character, Integer> entry : tmap.entrySet()) {
            if (!smap.containsKey(entry.getKey())) {
                return false;
            }else if (entry.getValue() > smap.get(entry.getKey())) {
                    return false;
                }
            }
        return true;
    }


}

代码思路学习灵茶山艾府 - 力扣(LeetCode)

相关推荐
CCPC不拿奖不改名2 分钟前
面向对象编程:继承与多态+面试习题
开发语言·数据结构·python·学习·面试·职场和发展
꧁Q༒ོγ꧂4 分钟前
算法详解(二)--算法思想基础
java·数据结构·算法
꧁Q༒ོγ꧂5 分钟前
算法详解(一)--算法系列开篇:什么是算法?
开发语言·c++·算法
橘颂TA5 分钟前
【剑斩OFFER】算法的暴力美学——力扣:1047 题:删除字符串中的所有相邻重复项
c++·算法·leetcode·职场和发展·结构于算法
2301_800256115 分钟前
R-Tree创建与遍历,R-Tree在4类空间查询中的应用,实现4类空间查询的各类算法[第8章]
数据库·算法·机器学习·postgresql·r-tree
Dontla11 分钟前
Mock Interview模拟面试,20251225,MNC第一面HR面,AI Engineer
职场和发展
BFT白芙堂11 分钟前
基于 GPU 并行加速的 pRRTC 算法:赋能 Franka 机械臂的高效、稳定运动规划
人工智能·深度学习·算法·机器学习·gpu·具身智能·frankaresearch3
牛老师讲GIS12 分钟前
多边形简化讲解:从四大核心算法到 Mapshaper 自动化实战
网络·算法·自动化
炽烈小老头18 分钟前
【每天学习一点算法 2026/01/08】计数质数
学习·算法
h7ml18 分钟前
企业微信通讯录同步服务的增量更新算法与冲突解决策略
服务器·算法·企业微信