蓝桥杯(Java)—— 算法训练 区间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。

分别使用了冒泡排序和sort()函数两种方法解题, 对比发现使用sort()方法CPU使用时间少、内存使用略大;冒泡排序在CPU使用时间上多200多ms。相比较而言,使用sort()方法更优。代码如下:

import java.util.*;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		int[] arr = new int[n];
		for(int i = 0; i < n; i++) {
			arr[i] = input.nextInt();
		}
		int m = input.nextInt();
		int[][] in = new int[m][3];
		for(int i = 0; i < m; i++) {
			for(int j = 0; j < 3; j++) {
				in[i][j] = input.nextInt();
			}
		}
		int[] out = new int[m];
		for(int i = 0; i < m; i++) {
			out[i] = select(in[i][0],in[i][1],in[i][2],arr);
		}
		// 输出结果
		for(int i = 0; i < m; i++) {
			System.out.println(out[i]);
		}
		input.close();
	}
	public static int select(int l, int r,int k,int[] arr) {
		int len = r - l + 1;
		int[] sele_arr = new int[len];
		for(int i = 0; i < len; i ++) {
			sele_arr[i] = arr[l + i - 1];
		}
//      1.冒泡排序:较大的数排在后面  2. 函数排序
//		Arrays.sort(sele_arr);
		for(int i = 0; i < len - 1; i++) {
			for(int j = 0; j < len - i - 1; j++) {
				if(sele_arr[j] > sele_arr[j + 1]) {
					int tag = sele_arr[j];
					sele_arr[j] = sele_arr[j + 1];
					sele_arr[j + 1] = tag;
				}
			}
		}
		return sele_arr[len - k];
	}

}
发布了18 篇原创文章 · 获赞 1 · 访问量 1002

猜你喜欢

转载自blog.csdn.net/qq_38969094/article/details/86760677
今日推荐