演算法筆記_079:藍橋杯練習 區間k大數查詢(Java)

來源:互聯網
上載者:User

標籤:排列   對象   length   nbsp   規模   name   href   next   size   

目錄

1 問題描述

2 解決方案

  1 問題描述問題描述

給定一個序列,每次詢問序列中第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。

  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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.