蓝桥杯——区间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。
代码:
import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws Exception {

		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();// 读取n的值

		// 将数字序列存放到数组中
		int[] arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = sc.nextInt();
		}

		// 读取m行查询的次数
		int m = sc.nextInt();

		int[] result = new int[m];// 存放结果的数组
		for (int i = 0; i < m; i++) {
			int l = sc.nextInt();
			int r = sc.nextInt();
			int k = sc.nextInt();
			// 定义一个辅助数组,存放截取的数组片段
			int[] assist = new int[r - l + 1];
			int index1 = 0;
			for (int j = l - 1; j < r; j++) {
				assist[index1++] = arr[j];// 存放l~r的数据
			}

			// 对辅助数组进行排序
			Arrays.sort(assist);

			// 存放结果的数组,数组assist的长度减去第k大的值的索引就是要求的第k大的数字
			result[i] = assist[assist.length - k];
		}

		// 输出结果
		for (int i : result) {
			System.out.println(i);
		}
	}
}
官方给出的输入文档:
42
18468 6335 26501 19170 15725 11479 29359 26963 24465 5706 28146 23282 16828 9962 492 2996 11943 4828 5437 32392 14605 3903 154 293 12383 17422 18717 19719 19896 5448 21727 14772 11539 1870 19913 25668 26300 17036 9895 28704 23812 31323 
34
3 34 6
26 30 4
9 12 3
4 40 21
30 40 8
11 23 7
15 37 13
11 35 18
11 29 11
15 34 10
11 21 3
22 34 13
16 24 1
5 25 18
11 27 9
17 19 1
15 26 6
33 35 1
36 40 4
20 36 11
19 25 6
6 39 15
18 24 3
5 13 7
24 34 5
5 7 1
6 31 22
10 30 14
41 42 1
16 17 1
23 29 7
32 36 3
2 24 16
10 36 27
输出文档:
24465
17422
23282
14605
11539
9962
11943
5437
11943
11943
23282
154
32392
2996
11943
11943
5437
19913
17036
12383
293
17036
5437
15725
17422
29359
3903
5448
31323
11943
154
14772
5706
154
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bu Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值