蓝桥杯 美丽的区间 尺取法 Java

题目描述

给定一个长度为 n 的序列 a1,a2⋯,an​ 和一个常数 S。

对于一个连续区间如果它的区间和大于或等于S,则称它为美丽的区间。

对于一个美丽的区间,如果其区间长度越短,它就越美丽。

请你从序列中找出最美丽的区间​。

输入描述

第一行包含两个整数 n,S,其含义如题所述。

接下来一行包含n 个整数,分别表示1,2,⋯,a1​,a2​,⋯,an​。

10≤N≤10510≤N≤105,1×ai≤104 ,1≤S≤108 1≤S≤108。

输出描述

输出共一行,包含一个整数,表示最美丽的区间的长度。

若不存在任何美丽的区间,则输出 00。

输入输出样例

示例 1

输入

5 6
1 2 3 4 5

输出

2

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

 while((sum-arr[l])>=s){
          sum -=arr[l];
          l++;
          min = Math.min(min, r-l+1);//记录最小的长度
 }

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        //------------读入-------
      Scanner sc = new Scanner(System.in);
      int n = sc.nextInt();
      int s = sc.nextInt();
      int arr[] = new int[n];
      for(int i =0;i<n;i++){
        arr[i] = sc.nextInt();
      }
       //设[l,r]区间,将下标为r的都求和,如果sum减去l的还大于或等于s,就说明可以删去l的了
      int sum =0,min = Integer.MAX_VALUE;
      for(int r = 0,r=0; r<n && j<n;r++){
        sum += arr[r];
        while((sum-arr[l])>=s){
          sum -=arr[l];
          l++;
          min = Math.min(min, r-l+1);//记录最小的长度
        }
      }
      if(min == Integer.MAX_VALUE){//如果min还等于初始值,说明没有符合长度
        System.out.println(0);
      }else{
        System.out.println(min);
      }

    }
}

posted @   limyu  阅读(34)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示