<02.22>Leetcode100

news/2025/2/23 14:39:06

  滑动窗口要求是我们的窗口大小和对应的窗口序列和需要是单调增的,换个话说就是元素的正负是一致的,我right++之后序列和变大,left--之后序列和变小。

 

java">import java.io.*;
import java.util.*;
/*
输入 abcabcbb
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

        //读入字符串并转化成char数组
        char[] g = br.readLine().toCharArray();
        Set<Character> set = new HashSet<>();//去重 用HashSet
        int ans = 0;//注意如果是空字符串的话应该是0
        
        //滑动窗口模板(不固定长度时候)
        //外层循环拓展右边界 内层循环拓展左边界
        for(int l=0,r=0;r<g.length;r++){
            char ch = g[r];//右指针指向的元素
            while(l<=r&&set.contains(ch)){
                set.remove(g[l]);
                l++;
            }
            set.add(g[r]);
            ans = Math.max(ans,set.size());
        }
        pw.println(ans);
//          return ans;
        br.close();
        pw.close();
    }
}

 

java">import java.io.*;
import java.util.*;
/*
输入
cbaebabacd
abc
[0,6]
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

        //读入字符串并转化成char数组
        char[] s = br.readLine().toCharArray();
        char[] p = br.readLine().toCharArray();

        List<Integer> ans = new ArrayList<Integer>();
        if(s.length < p.length)pw.println(ans);

        int[] count = new int[26];
        for(int i=0;i<p.length;i++)count[p[i]-'a']++;

        for(int l=0,r=0;r<s.length;r++){
            count[s[r] - 'a'] --;//窗口里面添加这个数了 那么就减去
            while(count[s[r] - 'a'] < 0){
                count[s[l] - 'a']++;
                l ++ ;
            }
            if(r-l+1 == p.length)ans.add(l);
        }
        pw.println(ans);
        br.close();
        pw.close();
    }
}

 

 

java">import java.io.*;
import java.util.*;
/*
输入
cbaebabacd
abc
[0,6]
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

        String[] s_1 = br.readLine().split(" ");
        int[] nums = new int[s_1.length];
        String s_2= br.readLine();
        int k =Integer.parseInt(s_2);

        int ans = 0;
        int s = 0;
        Map<Integer, Integer> cnt = new HashMap<>(nums.length + 1); // 设置容量可以快 2ms
        cnt.put(0, 1); // s[0]=0 单独统计
        for (int x : nums) {
            s += x;
            ans += cnt.getOrDefault(s - k, 0);//有key:s-k用s-k的值 否则就用0
            cnt.put(s, cnt.getOrDefault(s, 0) + 1); 
        }
//        return ans;
        pw.println(ans);
        br.close();
        pw.close();
    }
}

 

java">import java.io.*;
import java.util.*;
/*
输入
输入1 3 -1 -3 5 3 6 7
3
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

        String[] s_1 = br.readLine().split(" ");int[] nums = new int[s_1.length];
        String s_2= br.readLine();                     int k =Integer.parseInt(s_2);
        for(int i=0; i<nums.length; i++)nums[i]=Integer.parseInt(s_1[i]);//记得填充数据
        List<Integer> ans = new ArrayList<>();
        //滑动窗口 维护窗口内的最大值 双端队列实现
        Deque<Integer> q = new ArrayDeque<>();
        int n = nums.length;
        for(int i=0;i<n;i++){
            //如果当前数字比队尾索引对应数字大 去除队尾元素 q.getFirst维护的是最大值的index
            while(!q.isEmpty() && nums[q.getLast()] <= nums[i]){
                q.removeLast();
            }
            //不论如何将当前元素的索引加入
            q.addLast(i);
            //已知长度 左+右- 指的是1
            //i是右端点 q.getFrist是左端点
            //同时维护队列的队头在滑动窗口中
            while(i - q.getFirst() + 1 > k){
                q.removeFirst();//出队
            }
            //当遍历指针走到一个窗口的右边缘 开始记录ans
            if(i>=k-1){
                ans.add(nums[q.getFirst()]);
            }
        }
        pw.println(ans);
//        return ans;
        br.close();
        pw.close();
    }
}

 

 


http://www.niftyadmin.cn/n/5863484.html

相关文章

[ Vim ] 常用命令 and 配置

Vim 指导 Vim常用命令&配置1 Command1.1 copy & paste1.2 syntax highlight 2 Configuration Vim常用命令&配置 1 Command 1.1 copy & paste copy: yy or yy[n] paste: p 1.2 syntax highlight vim 命令行&#xff1a;:colorscheme [xxx] 2 Configuratio…

常用设计模式(embeded Qt)

常用设计模式&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09; 应用场景&#xff1a;传感器数据更新、UI状态同步。实现方式&#xff1a;通过QT的信号槽机制&#xff08;本质是发布-订阅模式&#xff09;自动实现。例如&#xff1a;connect(sensor, &Sens…

SpringBoot 如何统一 API 响应格式

一、为什么要统一 在真实项目开发中&#xff0c;你是否遇到过这些问题&#xff1f; 前端需要为不同接口编写差异化处理逻辑错误信息格式五花八门&#xff0c;定位问题困难全局异常处理缺失导致敏感信息泄露 在前后端分离架构中&#xff0c;统一的 API 响应格式是提升协作效率…

详解Virtualhome环境搭建教程 | 智能体

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 本篇文章毛毛张想分享的是搭建VitrualHome环境的教程&#xff0c;这个内容在国内很少有人在做&#xff0c;或者做的时候分享的教程比较少&#xff0c;毛毛张在此记录…

趣味数学300题1981版-十五个正方形

分析&#xff1a;移动两根变成11个正方形很简单&#xff1a; 移动4根变成15个正方形&#xff0c;分析&#xff1a; 一个田字格包含5个正方形&#xff0c;若要15个正方形需要3个田字格&#xff0c;如果3个田字格完全不重合&#xff0c;需要6*318根火柴。如果合并正方形的边&…

AI大模型学习(二): LangChain(二)

Langchain构建聊天机器人 安装依赖 pip install langchain_community Chat History:它允许聊天机器人"记住"过去的互动,并在回应后续问题时考虑他们 代码 # 创建模型 from langchain_core.messages import HumanMessage from langchain_core.prompts import ChatP…

如何保存爬虫获取商品评论的数据?

保存爬取的评论数据是爬虫项目中的一个重要环节。根据需求&#xff0c;你可以选择将数据保存为本地文件&#xff08;如CSV、JSON、TXT&#xff09;&#xff0c;或者存储到数据库&#xff08;如MySQL、MongoDB等&#xff09;。以下是几种常见的数据保存方式及其示例代码。 1. 保…

ChatGPT平替自由!DeepSeek-R1私有化部署全景攻略

一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;轻量级模型 ▌DeepSeek-R1-1.5B 内存容量&#xff1a;≥8GB 显卡需求&#xff1a;支持CPU推理&#xff08;无需独立GPU&#xff09; 适用场景&#xff1a;本地环境验证测试/Ollama集成调试 &#xff08;二&a…