题目链接:?1302: 区间k大数查询
Description
给定一个序列,每次询问序列中第l
个数到第r
个数中第k
大的数是哪个。
Input
多组测试数据,每组测试数据的格式如下:
第一行包含一个数n
,表示序列长度。
第二行包含n
个正整数,表示给定的序列。
第三个包含一个正整数m
,表示询问个数。
接下来m
行,每行三个数l
,r
,k
,表示询问序列从左往右第l
个数到第r
个数中,从大往小第k
大的数是哪个。序列元素从1开始标号。
Output
每组测试数据总共输出m
行,每行一个数,表示询问的答案。
Sample Input
5
1 2 3 4 5
2
1 5 2
2 3 2
Sample Output
4
2
HINT
数据规模与约定
对于30%的数据,n,m<=100;
对于100%的数据,n,m<=1000;
保证k<=(r-l+1)
,序列中的数<=10^6。
分析?
复制子序列到新数组,将新数组升序排序,输出第k
大的数即可
用时2156ms,然而有人提交300ms,有大佬知道代码怎么写的吗?虚心求教。
代码?
/**
* Time 2156ms
* @author wowpH
* @version 1.3
* @date 2019年6月8日下午10:15:33
* Environment: Windows 10
* IDE Version: Eclipse 2019-3
* JDK Version: JDK1.8.0_112
*/
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(new InputStreamReader(System.in));
int n, m, left, right, k;
int[] fn, subsequence;
fn = new int[1001];
while (sc.hasNext()) {
n = sc.nextInt();
for (int i = 1; i <= n; i++) {
fn[i] = sc.nextInt();
}
m = sc.nextInt();
for (int i = 0; i < m; i++) {
left = sc.nextInt();
right = sc.nextInt();
k = sc.nextInt();
subsequence = Arrays.copyOfRange(fn, left, right + 1);
Arrays.sort(subsequence);
System.out.println(subsequence[right - left + 1 - k]);
}
}
sc.close();
}
}