算法笔记_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 ...
随机推荐
- SpringBoot整合SpringSecurity简单实现登入登出从零搭建
技术栈 : SpringBoot + SpringSecurity + jpa + freemark ,完整项目地址 : https://github.com/EalenXie/spring-secu ...
- 线段树+扫描线【bzoj1645】[USACO07OPEN]城市的地平线City Horizon
Description 约翰带着奶牛去都市观光.在落日的余晖里,他们看到了一幢接一幢的摩天高楼的轮廓在地平线 上形成美丽的图案.以地平线为 X 轴,每幢高楼的轮廓是一个位于地平线上的矩形,彼此间可能有 ...
- 渗透脚本快速生成工具Intersect
渗透脚本快速生成工具Intersect 当渗透人员获取目标系统的执行权限,往往需要编写相应的脚本,实现更多的渗透操作.Kali Linux提供一款Python脚本快速生成工具Intersect.该 ...
- [Codeforces #196] Tutorial
Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...
- 【图论】Popular Cows
[POJ2186]Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34752 Accepted: ...
- 【最大流/费用流】BZOJ1834-[ZJOI2010]network 网络扩容
[题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费 ...
- HDU 5299 Circles Game 博弈论 暴力
Circles Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5299 Description There are n circles on ...
- 动态扩展php组件(mbstring为例)
1.进入源码包中的mbstring目录 cd ~/php-/ext/mbstring/ 2.启动phpize /usr/local/php/bin/phpize 3.配置configure ./con ...
- 使用Python SocketServer快速实现多线程网络服务器
Python SocketServer使用介绍 1.简介: SocketServer是python的一个网络服务器框架,可以减少开发人员编写网络服务器程序的工作量. SocketServer总共有4个 ...
- WPF中的动画——(六)演示图板
前面所介绍的都是单一的动画,它只能修改单一属性.有的时候,我们需要将一组动画一起进行,对于一个按钮,我们可能有如下需求: 选择该按钮时,该按钮增大并更改颜色. 单击该按钮时,该按钮缩小并恢复其原始大小 ...