算法笔记_079:蓝桥杯练习 区间k大数查询(Java)
目录
1 问题描述
给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。
第一行包含一个数n,表示序列长度。
第二行包含n个正整数,表示给定的序列。
第三个包含一个正整数m,表示询问个数。
接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。
1 2 3 4 5
2
1 5 2
2 3 2
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)的更多相关文章
- 蓝桥杯ALGO-1,区间k大数查询
#include<stdio.h> int devide(long a[], int low, int high) { long key = a[high]; while (low< ...
- 算法笔记_057:蓝桥杯练习 最大的算式 (Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就 ...
- 算法笔记_061:蓝桥杯练习 字串统计(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然 ...
- 算法笔记_123:蓝桥杯第七届省赛(Java语言B组部分习题)试题解答
目录 1 凑算式 2 方格填数 3 四平方和 1 凑算式 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A ...
- 算法笔记_086:蓝桥杯练习 9-2 文本加密(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A"转化"B" ...
- 算法笔记_063:蓝桥杯练习 送分啦(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 这题想得分吗?想,请输出“yes”:不想,请输出“no”. 输出格式 输出包括一行,为“yes”或“no”. 2 解决方案 初步一看,这题 ...
- 试题 算法训练 区间k大数查询 java题解
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正 ...
- 蓝桥杯 算法训练 区间k大数查询(水题)
算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...
- 蓝桥杯--算法训练 区间k大数查询
算法训练 区间k大数查询 时间限制:1.0 ...
随机推荐
- 洛谷P3901 数列找不同 [莫队]
题目传送门 题目描述 现有数列 A_1,A_2,\cdots,A_NA1,A2,⋯,AN ,Q 个询问 (L_i,R_i)(Li,Ri) , A_{Li} ,A_{Li+1},\cdots, ...
- WeGame导致WSL无法监听端口问题
Windows 10 系统自带Linux子系统(WSL),可以方便的使用WSL运行Linux程序和脚本.笔者在WSL上运行Redis时突然发现无法监听6379端口,尝试重新安装WSL无果. 后来重新安 ...
- 解决Linux用户模板文件被删除后显示不正常问题
缺失用户模板文件(用户骨架文件)会导致shell提示符不完整,可以到/etc/skel/目录下复制相关文件来恢复 (1).创建测试环境,删除模板文件 [root@xuexi ~]# useradd t ...
- UGUI的优点新UI系统四 开源
UGUI的优点新UI系统四 开源 新UI系统是开源的,所以开发者可以看到新UI系统实现的源码,并加以修改和使用. 开源授权协议——MIT/X11 Unity所搭载的新UI系统,是在开源授权协议MIT/ ...
- Codeforces Round #450 (Div. 2) ABCD
这次还是能看的0 0,没出现一题掉分情况. QAQ前两次掉分还被hack了0 0,两行清泪. A. Find Extra One You have n distinct points on a p ...
- [UOJ218]火车管理
建一棵答案线段树存栈顶值,两棵可持久化线段树分别存栈顶值和栈顶元素入栈时间 询问就直接在答案线段树上查,弹栈就用入栈时间在对应版本的可持久化线段树上查询即可,修改就是可持久化线段树的区间覆盖 以前一直 ...
- List the Books
描述 Jim is fond of reading books, and he has so many books that sometimes it's hard for him to manage ...
- Educational Codeforces Round 6 D. Professor GukiZ and Two Arrays 二分
D. Professor GukiZ and Two Arrays 题目连接: http://www.codeforces.com/contest/620/problem/D Description ...
- location和history
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Bestreviewapp给iOS软件写评论赚钱
BestReviewApp 这是一个评论类的活动,网站上会提供App列表,在iTunes评论这些应用就能获得报酬.目前账号中的余额可通过PayPal或支付宝提取出来.BestReviewApp 开放的 ...