蓝桥试题 算法训练 区间k大数查询 JAVA

问题描述
给定一个序列,每次询问序列中第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

思路:

第四行——1至5从大到小排序5 4 3 2 1 第2位是 4

第五行——2至3从大到小排序3 2 第2位是2


import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] arr = new int[n];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = scanner.nextInt();
		}
		int m = scanner.nextInt();     // 指定询问个数
		for (int i = 0; i < m; i++) {
			int l = scanner.nextInt(); // 开始
			int r = scanner.nextInt(); // 结束
			int k = scanner.nextInt(); // 指定索引元素
			int temp[] = new int[r - l + 1];
			int index1 = 0;            // 定义下标1			
			for (int j = l - 1; j <= r - 1; j++) {  // 指定范围给新的数组
				temp[index1++] = arr[j];
			}
			Arrays.sort(temp);                      // 对该数组进行排序
			int down[] = new int[temp.length];      // 定义数组取长度
			int index2 = temp.length - 1;           // 定义下标2						
			for (int j = 0; j < down.length; j++) { // 将排好序的数组按倒序方式给下一个新 的数组
				down[j] = temp[index2--];
			}			
			System.out.println(down[k - 1]);        // 输出新数组指定索引位置元素
		}
	}
}

小剧场:这天下 风情千万般 值得觊觎一眼

发布了161 篇原创文章 · 获赞 120 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43771695/article/details/104849701