您的位置:首页 > 其它

算法训练 区间k大数查询(数组复制、排序算法、递归查找)

2014-02-09 13:17 405 查看
  算法训练 区间k大数查询  

时间限制:1.0s   内存限制:256.0MB
      

问题描述

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

/**
* @param args
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int
;
for (int i = 0; i < n; i++)
a[i] = sc.nextInt();
int m = sc.nextInt();
while (m-- > 0) {
int l = sc.nextInt();
int r = sc.nextInt();
int k = sc.nextInt();
int length = r - l + 1;
int[] b = new int[length];
System.arraycopy(a, l - 1, b, 0, length);
Arrays.sort(b);
System.out.println(b[length - k]);
}
}
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

/**
* @param args
* @throws IOException
* @throws
*/

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
int[] arr = new int[n + 1];
for (int i = 1; i < n + 1; i++) {
arr[i] = Integer.parseInt(s[i - 1]);
}
int m = Integer.parseInt(br.readLine());
for (int i = 0; i < m; i++) {
String[] s1 = br.readLine().split(" ");
int l = Integer.parseInt(s1[0]);
int r = Integer.parseInt(s1[1]);
int k = Integer.parseInt(s1[2]);
int size = r - l + 1;
int[] brr = new int[size + 1];
System.arraycopy(arr, l, brr, 1, size);
int result = SelectMaxK(brr, 1, size, k);
System.out.println(result);
}
}

private static int SelectMaxK(int[] brr, int low, int high, int k) {
// TODO Auto-generated method stub
int s = Partition(brr, low, high);
if (s == k)
return brr[s];
if (k < s)
return SelectMaxK(brr, low, s - 1, k);

return SelectMaxK(brr, s + 1, high, k);

}

private static int Partition(int[] brr, int low, int high) {
// TODO Auto-generated method stub
int i = low;
int j = high;
while (i < j) {
while (i < j && brr[i] >= brr[j])
j--;
if (i < j) {
int temp = brr[i];
brr[i] = brr[j];
brr[j] = temp;
i++;
}
while (i < j && brr[i] >= brr[j])
i++;
if (i < j) {
int temp = brr[i];
brr[i] = brr[j];
brr[j] = temp;
j--;
}
}
return i;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: