滑动窗口->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());
    }
}
相关推荐
Code_Solitude5 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司5 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP7 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀8 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落9 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Pniubi9 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
꧁细听勿语情꧂10 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
俊俊几年的11 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c
小雉系统20 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构