区间K大数查找 Java 蓝桥杯ALGO-1

 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3
 4 public class Main {
 5     public static void main(String[] args) {
 6     Scanner aScanner = new Scanner(System.in);
 7     int n= aScanner.nextInt();   //读第一个
 8     long a[] = new long[n];      //存放数组
 9     long b[] = new long[n];      //备用数组
10
11     for(int i=0;i<n;i++)
12     {
13         a[i] = aScanner.nextInt();
14     }
15     int m = aScanner.nextInt();
16     int []l = new int[1001];
17     int []r = new int[1001];
18     int []k = new int[1001];
19     for(int i=0;i<m;i++)
20     {
21         l[i] = aScanner.nextInt();
22         r[i] = aScanner.nextInt();
23         k[i] = aScanner.nextInt();
24         for(int j=l[i]-1;j<r[i];j++)
25         {
26             b[j-l[i]+1] = a[j];
27         }
28         Arrays.sort(b);
29         System.out.println(b[b.length-k[i]]);
30         Arrays.fill(b, ‘\0‘);
31
32     }
33     }
34 }

  刚开始做的时候使用的二维数组,使用冒泡排序,但涉及到了三层循环,最后虽然结果出来了,但是运行超时。

  于是就需求更优化的方法,后来参考网上的标准答案后有一个排序函数可以用sort()函数,直接使用Arrays.sort()函数对数组进行从小到大的排序,每次得出结果后直接输出。

同时循环一次后需要对结果进行清空,我使用的是Arrays.fill()函数,用‘\0’来填充,但也有不足的地方,会在清空后都是0的形式存在,数组的长度没有变化,所以需要我之后进一步改进,最后的评测结果如图:仍旧有一个运行超时!!,仅供参考

原文地址:https://www.cnblogs.com/liuhui5599/p/8600758.html

时间: 2024-11-09 08:54:26

区间K大数查找 Java 蓝桥杯ALGO-1的相关文章

蓝桥杯--算法训练 区间k大数查询

算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数. 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个.序列元素从1开始标号. 输出格式 总共输出m行,每行一个数,表示询问的答案. 样例输入 51 2 3 4 521 5

1501130926-蓝桥杯- 算法训练 区间k大数查询

算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数. 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个.序列元素从1开始标号. 输出格式 总共输出m行,每行一个数,表示询问的答案. 样例输入 5 1 2 3 4 5 2 1

[ALGO-1] 区间k大数查询

算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数. 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个.序列元素从1开始标号. 输出格式 总共输出m行,每行一个数,表示询问的答案. 样例输入 5 1 2 3 4 5 2 1

区间k大数查询

import java.util.*; import java.io.*; public class 区间k大数查询 { public static void main(String[] args){ Scanner in=new Scanner(new BufferedInputStream(System.in)); int n = in.nextInt(); int[] num = new int[n]; for (int i = 0; i < n; i++) { num[i] = in.n

【树状数组套主席树】带修改区间K大数

P2617 Dynamic Rankings 题目描述给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题.你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令. 对于每一个询问指令,你必须输出正确的回答. 输入输出格式输入格

算法训练——区间K大数查询

//区间K大数查询 #include<stdio.h> int main(){ int n,m,l,r,k,index = 0; scanf("%d",&n); int a[n]; for(int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); while(m--){ int b[n]; scanf("%d%d%d",&l,&a

数据结构之区间K大数

求区间的问题有很多类,虽然前人有很多讲解了: 但是我在这里在普及一下,算是自己的一种复习吧. 1.静态询问一个区间的的第k大数,比如询问[l,r] k大数.虽然主席树可以处理,但是这类问题应该是划分树最合适的地方. 划分树--- 实际上是利用大概一种类似快排的思想 来求解第K大数. 建树 建树的过程比较简单,对于区间[l,r],首先通过对原数组的排序找到这个区间的中位数a[mid],小于a[mid]的数划入他的左子树[l,mid-1],大于它的划入右子树[mid,r].同时,对于第i个数,记录在

算法笔记_079:蓝桥杯练习 区间k大数查询(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数. 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个.序列元素从1开始标号. 输出格式 总共输出m行,每行一个数,表示询问的答案. 样例输入 51 2 3 4 521 5 22 3 2 样例输出

蓝桥杯ALGO-1,区间k大数查询

#include<stdio.h> int devide(long a[],int low,int high){ long key=a[high]; while(low<high){ while(low<high&&a[low]>key){ low++; } if(low<high) a[high--]=a[low]; while(low<high&&a[high]<key){ high--; } if(low<high