Featured image of post Sliding Window

Sliding Window

滑动窗口的最大值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] ans=new int[n];
        for(i=0;i<n;i++){
            ans[i]=sc.nextInt();
        }
        int m=sc.nextInt();
        int left=0,right=0;
        int res=Integer.MIN_VALUE;
        int tmp=0;

        while(right<n){
            if(right-left+1<m){
                tmp+=ans[left];
                right++;
                continue;
            }
            if(right-left+1>m){
                tmp-=ans[left];
                left++;
            }
            tmp+=ans[right];
            res=Math.max(res,tmp);
            right++;
        }
        System.out.println(res);
    }
}

最左侧冗余覆盖子串

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String pattern=sc.nextLine();
        String text=sc.nextLint();

        int maxExtraChars=sc.nextInt();
        sc.close();

        int startIndex=-1;
        int[] patternFreq=new int[26];
        for(char c:pattern.toCharArray()){
            patternFreq[c-'a']++;
        }
        int left=0,right=0;
        int remainingMatches=pattern.length();
        int[] windowFreq=new int[26];
        while(right<text.length()){
            char rightChar=text.charAt(right);
            windowFreq[right-'a']++;
            if(windowFreq[rightChar-'a']<=patternFreq[rightChar-'a']){
                remainingMatches--;
            }
            if(right-left+1>pattern.length()+maxExtraChars){
                char leftChar=text.charAt(left);
                if(windowFreq[leftChar-'a']<=patternFreq[leftChar-'a']){
                    remainingMatches++;
                }
                windowFreq[leftChar-'a']--;
                left++;
            }
            if(remainingMatches==0){
                startIndex=left;
                break;
            }
            right++;
        }
        System.out.println(startIndex);
    }
}

恢复数字序列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Main{
    static void addNumberToMap(int num,Map<Character,Integer> count){
        for(char c:String.valueOf(num).toCharArray()){
            count.put(c,count.getOrDefault(c,0)+1);
        }
    }
    static void removeNumberFromMap(int num,Map<Character,Integer> count){
        for(char c:String.valueOf(num).toCharArray()){
            count.put(c,count.get(c)-1);
            if(count.get(c)==0){
                count.remove(c);
            }
        }
    }
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        String s=scanner.next();
        int k=scanner.nextInt();
        scanner.close();
        Mao<Character,Integer> base=new HashMap<>();
        for(char c:s.toCharArray()){
            base.put(c,base.getOrDeault(c,0)+1);
        }
        Map<Character,Integer> count=new HashMap<>();
        for(int i=1;i<=k;i++){
            addNumberToMap(i,count);
        }
        if(count.equals(base)){
            System.out.println(1);
            return;
        }
        for(int i=2;i<=1000-k+1;i++){
            removeNumberFromMap(i-1,count);
            addNumberToMap(i+k-1,count);
            if(count.equals(base)){
                System.out.println(i);
                return;
            }
        }
    }
}

敌情监控

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int k=scanner.nextInt();
        int l=scanner.nextInt();
        int[] nums=new int[n];
        for(int i=0;i<n;i++){
            nums[i]=scanner.nextInt();
        }
        for(int i=0;i<l;i++){
            String command=sc.next();
            int arg1=scanner.nextInt();
            int arg2=scanner.nextInt();
            if(command.equals("Add")){
                int index=arg1-1;
                nums[index]+=arg2;
            }else if(command.equals("Sub")){
                int index=arg1-1;
                nums[index]-=arg2;
            }else{
                int start=arg1-1;
                int end=arg2-1;
                int currentSum=0;
                for(int j=start;j<start+k;j++){
                    currentSum+=nums[j];
                }
                int minSum=currentSum;
                for(int idx=start+i;idx<=end-k+1;idx++){
                    currentSum=currentSum-nums[idx-1]+nums[idx+k-1];
                    minSum=Math.min(minSum,currentSum);
                }
                System.out.println(minSum);
            }
        }
        scanner.close();
    }
}