藍橋杯演算法題庫 區間k大數查詢
阿新 • • 發佈:2018-12-23
藍橋杯演算法題庫 區間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。
解題思路
1、定義新陣列儲存原陣列從左往右第l個數到第r個數,注意:序列元素從1開始標號。
2、對新陣列進行排序輸出第k個數
3、具體流程見程式碼註釋
//java程式碼
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
//儲存使用者輸入資料
int n = sc.nextInt();
int num[ ] = new int[n];
for (int i = 0; i < n; i++) {
num[i] = sc.nextInt();
}
int m = sc.nextInt();
int[][] nums = new int[m][3];
//計算每次輸出的結果
for (int i = 0; i < m; i++) {
nums[i][0] = sc.nextInt();// 儲存l
nums[i][1] = sc.nextInt();// 儲存r
nums[i][2] = sc.nextInt();// 儲存k
//定義新陣列儲存擷取的原陣列
int[ ] num1 = new int[nums[i][1] - nums[i][0] + 1];
int k = 0;
//k為新陣列下標
//j為原陣列下標
for (int j = nums[i][0] - 1; j < nums[i][1]; j++) {
num1[k] = num[j];
k++;
}
//對陣列進行排序 升序
Arrays.sort(num1);
//輸出第k大的數
System.out.println(num1[num1.length - nums[i][2]]);
}
}