算法---区间K大数查找 Java 蓝桥杯ALGO-1

java

 1 import java.util.Arrays;

2 import java.util.Scanner;

3

4 public class Main {

5 public static void main(String[] args) {

6 Scanner aScanner = new Scanner(System.in);

7 int n= aScanner.nextInt(); //读第一个

8 long a[] = new long[n]; //存放数组

9 long b[] = new long[n]; //备用数组

10

11 for(int i=0;i<n;i++)

12 {

13 a[i] = aScanner.nextInt();

14 }

15 int m = aScanner.nextInt();

16 int []l = new int[1001];

17 int []r = new int[1001];

18 int []k = new int[1001];

19 for(int i=0;i<m;i++)

20 {

21 l[i] = aScanner.nextInt();

22 r[i] = aScanner.nextInt();

23 k[i] = aScanner.nextInt();

24 for(int j=l[i]-1;j<r[i];j++)

25 {

26 b[j-l[i]+1] = a[j];

27 }

28 Arrays.sort(b);

29 System.out.println(b[b.length-k[i]]);

30 Arrays.fill(b, '\0');

31

32 }

33 }

34 }

  刚开始做的时候使用的二维数组,使用冒泡排序,但涉及到了三层循环,最后虽然结果出来了,但是运行超时。

  于是就需求更优化的方法,后来参考网上的标准答案后有一个排序函数可以用sort()函数,直接使用Arrays.sort()函数对数组进行从小到大的排序,每次得出结果后直接输出。

同时循环一次后需要对结果进行清空,我使用的是Arrays.fill()函数,用‘\0’来填充,但也有不足的地方,会在清空后都是0的形式存在,数组的长度没有变化,所以需要我之后进一步改进,最后的评测结果如图:仍旧有一个运行超时!!,仅供参考

注:网络查找标准答案代码(Java,未加头文件,自行加入):

public class Main

{

private static BufferedInputStream in = new BufferedInputStream(System.in);

public static void main(String[] args) throws IOException {

int []nums = new int[readint()];

for(int i=0;i<nums.length;i++)

{

nums[i] = readint();

}

for(int i=readint();i>0;i--)

{

int a = readint();

int b = readint();

int c = readint();

int[] tn = new int[b-a+1];

for(int j=0;j<tn.length;j++)

{

tn[j] = nums[a-1+j];

}

Arrays.sort(tn);

System.out.println(tn[tn.length-c]);

}

}

private static int readint()throws IOException {

// TODO Auto-generated method stub

int i,sum=0;

while(((i=in.read())&48)!=48||i>57);

for(;(i&56)==48||(i&62)==56;i=in.read())

sum = sum*10+(i&15);

return sum;

}

}

以上是 算法---区间K大数查找 Java 蓝桥杯ALGO-1 的全部内容, 来源链接: utcz.com/z/390535.html

回到顶部