蓝桥杯---算法训练 区间k大数查询(最简单易懂的做法)

问题描述
给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。

输入格式
第一行包含一个数n,表示序列长度。

第二行包含n个正整数,表示给定的序列。

第三个包含一个正整数m,表示询问个数。

接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。

样例输入
5
1 2 3 4 5
2
1 5 2
2 3 2

样例输出
4
2

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
		// 序列长度
        int n = scan.nextInt();
		// 创建数组,长度为序列长度
        int arr1[] = new int[n];
		// for循环为数组赋值
        for(int i=0; i<n; i++){
            arr1[i] = scan.nextInt();
        }
        //询问个数
        int m = scan.nextInt();
        //创建二维数组存放每一次的l,r,k
        int[][] arr2 = new int[m][3];
        //存放每一次询问的结果
        int[] result = new int[m];
        for(int i=0; i<m; i++){
            for(int j=0; j<3; j++){
                arr2[i][j] = scan.nextInt();
            }
            //调用result函数求出每次询问的值
            result[i] = search(arr1,arr2[i][0],arr2[i][1],arr2[i][2]);
        }
        for(int i: result){
            System.out.println(i);
        }
    }

    public static int search(int[] arr,int l, int r,int k){
    	// 创建询问数组的长度为右区间-左区间+1
        int[] arr1 = new int[r-l+1];
        for(int i=0,j=l-1; i<arr1.length; i++,j++){
        //将要判断的数据存放到新的数组中
            arr1[i] = arr[j];
        }
        Arrays.sort(arr1);
        //最后返回结果,其实就是倒序输出,想一想就明白了
        return arr1[arr1.length-k];
    }
}

有不懂的可以评论区问我,附带一张我的结果图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值