滑动窗口->dd爱框框

1.题目:

2.题解:

2.1为什么用滑动窗口优化:

因为元素都是大于0的

所以:当找到大于等于x的值时,right可以不用返回

两个指针都往后走;因此可以使用滑动窗口优化暴力解法

2.2:滑动窗口具体使用步骤:

1.进窗口:sum += arrayright;

2.判断:sum >= x 时出窗口

灵活更新结果(满足结果后) right-left+1<retlen

3.出窗口:sum -= arrayleft;


图解:


代码:这里注意使用了一个读取模板,不让Scanner输入会超时

java 复制代码
import java.util.*;
import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {
        
        Read in = new Read();
        int n = in.nextInt(), x = in.nextInt();
        
        int[] array = new int[n+1];//注意下标从1开始
        
        for(int i = 1; i <= n; i++){
            array[i] = in.nextInt();
        }
        
        int left = 1;
        int right = 1;
        int sum = 0;
        
        int retlen = n;
        int retLeft = -1;
        int retRight = -1;
        
        while(right <= n){
            //进窗口
            sum += array[right];
            
            //判断
            while(sum >= x){
                
                //更新结果
                if(right-left+1 < retlen){
                    retLeft = left;
                    retRight = right;
                    retlen = right-left+1;//更新以便于找出最小值
                }
                
                //出窗口
                sum -= array[left++]; 
            }
            
            right++;
        }
        
      System.out.print(retLeft +" " +retRight);
    }
}
    
 class Read // 自定义快速读入
{
    //字符串截取
    StringTokenizer st = new StringTokenizer("");

    //1.字节流->字符流:new InputStreamReader(System.in)
    //2.带内存缓冲区的字符流:BufferedReader

    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String next() throws IOException
    {
        while(!st.hasMoreTokens())
        {
            ///读内存缓冲区里的一行数据:bf.readLine()
            st = new StringTokenizer(bf.readLine());
        }

        //获取每一个截取的字符串
        return st.nextToken();
    }

    //转化为自己想要的类型
    String nextLine() throws IOException
    {
        return bf.readLine();
    }

     int nextInt() throws IOException
    {
        return Integer.parseInt(next());
    }

    long nextLong() throws IOException
    {
        return Long.parseLong(next());
    }

    double nextDouble() throws IOException
    {
        return Double.parseDouble(next());
    }
}
相关推荐
0+11136 分钟前
算法 --模拟
c++·算法·leetcode
青山是哪个青山42 分钟前
LeetCode 300:最长递增子序列
算法
hetao17338371 小时前
2026-10-01~02 hetao1733837 的刷题记录
c++·算法
小虎牙^O^1 小时前
模糊数学综合评价:从模糊数学到建模评价类模型
人工智能·算法
随意起个昵称1 小时前
【单调队列优化DP】U301134 绿色通道
算法·动态规划
Nil2082 小时前
leetcode 739每日温度
算法·leetcode·职场和发展
lvwangshu2 小时前
势能分析(摊还分析)
数据结构·数学·算法
盘古开天16662 小时前
PPO算法代码实战(三):PyTorch从零实现PPO求解CartPole
人工智能·pytorch·算法
yyy(十一月限定版)2 小时前
CF2138A Cake Assignment
算法
盘古开天16663 小时前
PPO算法原理详解(下):Clip机制深入剖析与实践指南
人工智能·算法·机器学习