1. 程式人生 > >藍橋杯演算法題庫 區間k大數查詢

藍橋杯演算法題庫 區間k大數查詢

藍橋杯演算法題庫 區間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]]); } }