这道题是蓝桥网上的一道算法题,略微有些简单,但是可以练练手。
刚看到这道题的时候,知道是要用排序来做,但是想偷个懒,就想用个循环,每次记录下最大的,然后循环k次最后一次就是题目所要求的答案,然而真正写的时候发现比字节排序还麻烦,想了想,还是按部就班的来写吧。
问题描述
给定一个序列,每次询问序列中第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。
算法思路:
1、定义一个原始数组并初始化
2、写一个循环,用来处理多组数据。
3、定义一个临时数组,然后根据Arrays对象的sort方法将l到r的数据升序存入。
4、然后将题目要求的第k大的数据存入结果数组中。
5、输出结果数组即可。
代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = scan.nextInt();
}
int nn = scan.nextInt();
int[] b = new int[nn];
int l = 0;
int r = 0;
int k = 0;
for (int i = 0; i < nn; i++) {
l = scan.nextInt();
r = scan.nextInt();
k = scan.nextInt();
int nnn = r-l+1;
int[] c = new int[nnn];
for (int j = l,w = 0; j <= r; j++,w++) {
c[w] = a[j-1];
}
Arrays.sort(c);
b[i] = c[nnn-k];
}
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]);
}
}
}