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

时间:2020-12-15 11:25:26
问题描述

给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。

输入格式

第一行包含一个数n,表示序列长度。

第二行包含n个正整数,表示给定的序列。

第三个包含一个正整数m,表示询问个数。

接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。

输出格式 总共输出m行,每行一个数,表示询问的答案。 样例输入 5
1 2 3 4 5
2
1 5 2
2 3 2
样例输出 4
2
数据规模与约定

对于30%的数据,n,m<=100;

对于100%的数据,n,m<=1000;

保证k<=(r-l+1),序列中的数<=106




使用排序算法。对于每次询问,将询问的区间取出存储到另一个数组里面,对新的数组进行排序并输出其中第K大的。

import java.util.Collections;
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
ArrayList alist = new ArrayList(n);
int[]a = new int[n];
for(int i=0 ; i<n ; i++){
a[i] = sc.nextInt();
}
int m =sc.nextInt();
int[] l = new int[m];
int[] r = new int[m];
int[] k = new int[m];
for(int i=0 ; i<m ; i++){
l[i] = sc.nextInt();
r[i] = sc.nextInt();
k[i] = sc.nextInt();

}
for(int i=0 ; i<m ; i++){ //以下代码重复执行m次数
for(int j=l[i]-1 ; j<=(r[i]-1) ; j++ ){
alist.add(a[j]); //将a中第l个到第r个元素添加到alist
}
Collections.sort(alist); //将alist排序
System.out.println(alist.get(r[i]-l[i]-k[i]+1)); //输出第k大的数
alist.clear(); //清空alist
}


}
}