滑动窗口->dd爱框框

1.题目:

2.题解:

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

因为元素都是大于0的

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

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

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

1.进窗口:sum += array[right];

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

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

3.出窗口:sum -= array[left];


图解:


代码:这里注意使用了一个读取模板,不让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());
    }
}
相关推荐
@心都7 分钟前
机器学习数学基础:42.AMOS 结构方程模型(SEM)分析的系统流程
人工智能·算法·机器学习
北顾南栀倾寒3 小时前
[算法笔记]cin和getline的并用、如何区分两个数据对、C++中std::tuple类
笔记·算法
一只大侠4 小时前
牛客周赛A:84:JAVA
算法
豆豆酱4 小时前
Informer方法论详解
算法
槐月初叁5 小时前
多模态推荐系统指标总结
算法
迪小莫学AI5 小时前
LeetCode 2588: 统计美丽子数组数目
算法·leetcode·职场和发展
昂子的博客5 小时前
热门面试题第十天|Leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素
算法
卑微小文6 小时前
2025国内网络反爬新高度:代理IP智能轮换算法揭秘
后端·算法·架构
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧7 小时前
C语言_数据结构总结7:顺序队列(循环队列)
c语言·开发语言·数据结构·算法·visualstudio·visual studio
LIUJH12337 小时前
数据结构——单调栈
开发语言·数据结构·c++·算法