「笔试刷题」:dd爱框框

server/2024/10/19 1:56:20/

一、题目

题目描述

读入n,xn,xn,x,给出nnn个数a[1],a[2],……,a[n]a[1],a[2],……,a[n]a[1],a[2],……,a[n],求最小的区间[l,r][l,r][l,r],使a[l]+a[l+1]+……+a[r]≥xa[l]+a[l+1]+……+a[r]≥xa[l]+a[l+1]+……+a[r]≥x,若存在相同长度区间,输出lll最小的那个

输入描述:

第一行两个数,n(1≤n≤10000000),x(1≤x≤10000)
第二行n个数a[i](1≤a[i]≤1000)

输出描述:

输出符合条件l,r(保证有解)

示例1

输入

10 20
1 1 6 10 9 3 3 5 3 7

输出

3 5

二、思路解析

这道题是求连续区间的,看到的第一眼,就都要想起 “滑动窗口” 这一算法

我们可以使用双指针技巧来解决这个问题。具体步骤如下:

  1. 初始化两个指针 left 和 right,初始位置都为数组的起始位置。
  2. 维护一个变量 sum,表示当前区间内子数组的和。
  3. 不断移动 right 指针,将元素加入当前区间,并更新 sum。
  4. 当 sum 大于等于 x 时,移动 left 指针,缩小区间范围,并更新 sum,直到区间不再满足 sum 大于等于 x 的条件。
  5. 在每次移动 left 和 right 指针时,记录满足条件的区间的最小长度和对应的左右边界。
  6. 最终得到的就是满足条件的最小区间。

并且,要注意的一点就是,这道题的数据量会比较大,且传统的 Scanner 读取会耗费比较大的时间,所以我们需要通过重写 IO 流,来提高我们的输入输出效率。

模版我也放在这啦👇

import java.util.*;
import java.io.*;public class Main
{public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));public static Read in = new Read();public static void main(String[] args) throws IOException{// 写代码out.close();}
}class Read // 自定义快速读入
{StringTokenizer st = new StringTokenizer("");BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String next() throws IOException {while(!st.hasMoreTokens()){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());}
}

三、完整代码

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();int x = in.nextInt();int[] nums = new int[n + 1];for(int i = 1; i <= n; i++){nums[i] = in.nextInt();}int left = 1, right = 1;int sum = 0;int retleft = -1, retright = -1, retLen = n;while(right <= n){sum += nums[right];while(sum >= x){if(right - left + 1 < retLen){retleft = left;retright = right;retLen = right - left + 1;}                sum -= nums[left++];}right++;}System.out.println(retleft + " " + retright);}}class Read{StringTokenizer st = new StringTokenizer("");BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String next() throws IOException{while(!st.hasMoreTokens()){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());}
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!


http://www.ppmy.cn/server/15949.html

相关文章

JVM 面试题

1. 什么情况下会发生栈内存溢出&#xff1f; 当线程调用堆栈深度超过虚拟机所允许的最大深度时&#xff0c;会抛出StackOverflowError。如果一个线程请求的栈深度超过了虚拟机的允许范围&#xff0c;会抛出OutOfMemoryError。 2. 说一下 JVM 的主要组成部分及其作用&#xff…

K8S基础概念

一、MASTER Kubernetes里的Master指的是集群控制节点&#xff0c;在每个Kubernetes集群里都需要有一个Master来负责整个集 群的管理和控制&#xff0c;基本上 Kubernetes的所有控制命令都发给它&#xff0c;它负责具体的执行过程&#xff0c;我们后 面执行的所有命 令基本都…

操作steam搬砖有哪些风险?你有中招吗?揭秘有没有规避技巧?

一、关于steam账号的地区问题&#xff1a; steam账号地区不要频繁的去更换&#xff0c;这样很容易导致让账号红信不能操作使用。 二、关于steam账号的充值问题&#xff1a; 一定要充值正规的礼品卡图&#xff0c;否则遇到黑卡分分钟让你的账号红锁&#xff0c;从而造成账号里…

EJB和Spring

1. EJB 1.1. 背景 功能日趋复杂的软件&#xff0c;如果把所有的功能实现都放在客户端&#xff0c;不仅代码没有安全性&#xff0c;部署及发布运维都会变的很复杂&#xff0c;所以将软件的功能实现分为客户端和服务端&#xff0c;服务端和客户端之间通过网络调用进行功能实现。…

【JavaScript】cookie

概述 cookie不可跨域 cookie存储在浏览器里面 cookie有数量与大小的限制 1、数量在50个左右 2、大小在4kb 左右 cookie的存储时间非常灵活 cookie不光可以服务器设置&#xff0c;客户端也可以设置 客户端 document.cookie 可以获取和写入&#xff0c;且只能设置一次&#…

Linux信号(处理)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; Linux信号(产生)-CSDN博客 Linux信号(保存)-CSDN博客 前面我们解释了信号的产生和保存&#xff0c;接下来我们就要解释信号的处理&#xff0c;关于操作系统在合适的时候对信号进行处理&#xff0c;合适…

大白话!go语言中的指针、指针类型的方法接收器

go语言中的指针使用起来的比较简单。应用如下&#xff1a; 1.普通的对象取地址&#xff0c;获取对象值 符号&&#xff0c;取地址符&#xff0c;可以取变量的地址&#xff0c;或结构体对象的地址等。符号*&#xff0c;是从地址中取值&#xff08;根据栈中存储地址&#xf…

如何使用PHP进行JSON编码和解码?

如何使用PHP进行JSON编码和解码&#xff1f; 使用PHP进行JSON编码和解码是开发过程中非常常见的任务。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它使得人们能够很容易地阅读和编写&#xff0c;同时也使得机器能够解析和…