目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述

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


2 解决方案

本题主要考查排序,考虑到时间效率和稳定性,此题选择合并排序最佳。

具体代码如下:

import java.util.Scanner;

public class Main {
//对数组array中下标start到end中的元素进行归并并排,求得该区间的降序排列
public void mergeSort(int[] array, int start, int end) {
if(end - start >= 1) {
int[] leftArray = getHalfArray(array, start, end, 0);
int[] rightArray = getHalfArray(array, start, end, 1);
mergeSort(leftArray, 0, leftArray.length - 1);
mergeSort(rightArray, 0, rightArray.length - 1);
getMerge(array, start, leftArray, rightArray); }
}
//根据judge获取数组array区间start~end的一半元素
public int[] getHalfArray(int[] array, int start, int end, int judge) {
int[] half;
int len = end - start + 1;
if(judge == 0) {
int length = len / 2;
half = new int[length];
for(int i = 0;i < length;i++)
half[i] = array[start + i];
} else {
int length = len - len / 2;
half = new int[length];
for(int i = 0;i < length;i++) {
half[i] = array[start + len / 2 + i];
}
}
return half;
}
//合并数组array的左半边元素和右半边元素,返回降序排列
public void getMerge(int[] array, int start, int[] leftArray, int[] rightArray) {
int i = 0, j = 0;
while(i < leftArray.length && j < rightArray.length) {
if(leftArray[i] >= rightArray[j])
array[start++] = leftArray[i++];
else
array[start++] = rightArray[j++];
}
while(i < leftArray.length) array[start++] = leftArray[i++];
while(j < rightArray.length) array[start++] = rightArray[j++];
} public void printResult(int[] array, int[][] query) {
int[] result = new int[query.length];
for(int i = 0;i < query.length;i++) {
int[] tempArray = new int[array.length]; //此处获取array的克隆对象,要求地址也要改变。若直接赋值,两者地址是一样
for(int j = 0;j < array.length;j++)
tempArray[j] = array[j];
int start = query[i][0];
int end = query[i][1];
int k = query[i][2];
if(k < 0 || k > end - start + 1) //防止k出界
continue;
mergeSort(tempArray, start - 1, end - 1);
result[i] = tempArray[start - 1 + k - 1];
}
//输出结果
for(int i = 0;i < result.length;i++)
System.out.println(result[i]);
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] array = new int[n];
for(int i = 0;i < array.length;i++)
array[i] = in.nextInt();
int m = in.nextInt();
if(n > 1000 || m > 1000)
return;
int[][] query = new int[m][3];
for(int i = 0;i < m;i++) {
query[i][0] = in.nextInt();
query[i][1] = in.nextInt();
query[i][2] = in.nextInt();
}
test.printResult(array, query);
}
}

算法笔记_079:蓝桥杯练习 区间k大数查询(Java)的更多相关文章

  1. 蓝桥杯ALGO-1,区间k大数查询

    #include<stdio.h> int devide(long a[], int low, int high) { long key = a[high]; while (low< ...

  2. 算法笔记_057:蓝桥杯练习 最大的算式 (Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就 ...

  3. 算法笔记_061:蓝桥杯练习 字串统计(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然 ...

  4. 算法笔记_123:蓝桥杯第七届省赛(Java语言B组部分习题)试题解答

     目录 1 凑算式 2 方格填数 3 四平方和   1 凑算式 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A ...

  5. 算法笔记_086:蓝桥杯练习 9-2 文本加密(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A"转化"B" ...

  6. 算法笔记_063:蓝桥杯练习 送分啦(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 这题想得分吗?想,请输出“yes”:不想,请输出“no”. 输出格式 输出包括一行,为“yes”或“no”. 2 解决方案 初步一看,这题 ...

  7. 试题 算法训练 区间k大数查询 java题解

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正 ...

  8. 蓝桥杯 算法训练 区间k大数查询(水题)

    算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...

  9. 蓝桥杯--算法训练 区间k大数查询

                                                                                 算法训练 区间k大数查询   时间限制:1.0 ...

随机推荐

  1. 洛谷P4302 [SCOI]字符串折叠 [字符串,区间DP]

    题目传送门 字符串折叠 题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如 ...

  2. 丑数(LintCode)

    丑数 设计一个算法,找出只含素因子3,5,7 的第 k大的数. 符合条件的数如:3,5,7,9,15...... 您在真实的面试中是否遇到过这个题? Yes 样例 如果k=4, 返回 9 挑战 要求时 ...

  3. Spring事务传播性

    事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题.事务最重要的两个特性,是事务的传播级别和数据隔离级别.传播级别定义的是事务的控制范围,事务隔离级别定 ...

  4. Problem G: 零起点学算法86——Fibonacc

    #include<stdio.h> int main(){ ]={,,}; ;i<=;i++) { a[i]=a[i-]+a[i-]; } scanf("%d", ...

  5. storm一键脚本

    1一键脚本 #!/bin/bash # 1 声明 #-------------------------------------- #请在strom/bin/下执行脚本 #supervisor-host ...

  6. 内核创建的用户进程printf不能输出一问的研究

    转:http://www.360doc.com/content/09/0315/10/26398_2812414.shtml 一:前言上个星期同事无意间说起,在用核中创建的用户空间进程中,使用prin ...

  7. 统计中的t检验

    1.什么情况下,应用t检验 1. 已知总体的均值m,或者我们假设了一个总体均值m: 2. 我们知道样本的个数n,样本的的方差var,样本的均值m: 3. 我们假设总体,或者样本都是服从正太分布的. 2 ...

  8. RRGGBBAA或者RRGGBB转换成rgba()

    //十六进制颜色值的正则表达式 var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; /*16进制颜色转为RGB格式*/ var colorRgb = fun ...

  9. linux环境php将word转换成pdf

    原文地址:http://www.niu12.com/article/15 ubuntu.java环境.openoffice.jodConverter.php 1.安装java环境 a. jdk下载(我 ...

  10. jquery dialog close icon missing 关闭图片丢失,样式丢失问题

    http://stackoverflow.com/questions/17367736/jquery-ui-dialog-missing-close-icon