区间K大数

来源:互联网 发布:服务器托管数据安全 编辑:程序博客网 时间:2024/05/29 04:07


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

1 2 3 4 5 

1 5 2 
2 3 2 
样例输出 


数据规模与约定 
对于30%的数据,n,m<=100; 
对于100%的数据,n,m<=1000; 
保证k<=(r-l+1),序列中的数<=106。


import java.util.Scanner;


public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // n个正数
int array[] = new int[n];
if (n <= 106) {
for (int i = 0; i < n; i++) {
array[i] = in.nextInt();
}
}
int m = in.nextInt(); // m表示1询问的个数
int array1[][] = new int[m][3]; // m行,每行三个数,表示l,r,k
for (int i = 0; i < m; i++) {
for (int j = 0; j < 3; j++) {
array1[i][j] = in.nextInt();
}
}
for (int i = 0; i < m; i++) {
int l = array1[i][0];
int r = array1[i][1];
int k = array1[i][2];
int num[] = new int[r - l + 1];
int l1 = l;
for (int j = 0; j < r - l + 1; j++) {
if (l1 <= r) {

num[j] = array[l1 - 1];
l1++;
}
}
for (int j = 0; j < r - l + 1; j++) { // 将选中的l到r得数从大到小排好序
for (int a = 0; a <= j; a++) {
if (num[j] >= num[a]) {
int p = num[j];
num[j] = num[a];
num[a] = p;
}
}
}
if (k <= r - l + 1) {
System.out.println(num[k - 1]);
}
}
in.close();
}
}
0 0
原创粉丝点击