2110 - 求第k大数

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB


<span style="font-weight:bold;font-size:16pt;font-family:'Courier New';">求第k大的数</span> 

<span style="font-weight:bold;font-size:10.5pt;font-family:'Courier New';">(Kth.pas/c/cpp)</span><span style="font-family:'sans serif', tahoma, verdana, helvetica;font-size:12px;line-height:1.5;"></span> 

<br />

给定一个长度为n(1≤n<span>≤1,000,000)的无序正整数序列,以及另一个数k(1<span>≤k<span>≤1,000,000</span></span>)(关于第k大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。)</span> 

题目输入

第一行两个正整数m,n。

第二行为n个正整数。

题目输出

第k大的数。

输入/输出样例

输入格式

6 3
1 2 3 4 5 6

输出格式

4

C语言解答

#include<stdio.h>
int main(){
    int amount,k,i;
    scanf("%d%d",&amount,&k);
    int a[amount],left[amount],right[amount];
    for(i=0;i<amount;i++)
    scanf("%d",&a[i]);
    printf("%d",search(a,k,amount));
}
int search(int b[],int kk,int amountb){
int left[amountb],right[amountb];
int i,numl=0;
int numr=0;
for (i=1;i<amountb;i++){
if(b[i]<=b[0]){left[numl]=b[i];numl++;}
if(b[i]>b[0]){right[numr]=b[i];numr++;}
}
if(numr>(kk-1))return search(right,kk,numr);
if(numr<(kk-1))return search(left,kk-numr-1,numl);
else return b[0];
}

C++解答

#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
using namespace std;

int main(){
	int n,k,t=1;cin>>n>>k;
	int a[n+1],ans[n+1];
	for(int i=1;i<=n;i++)
	  cin>>a[i];
	sort(a+1,a+n+1);
	
	ans[1]=a[1];
	for(int i=2;i<=n;i++)
	  if(a[i]!=ans[t]){
	  	ans[t+1]=a[i];
	  	t++;
	  }
	if(k>t) {cout<<"NO RESULT";return 0;}
	else cout<<ans[n-k+1]; 
	return 0;
}

Java解答

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

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n=input.nextInt();
		int k=input.nextInt();
		int[] a=new int[n];
		for(int i=0;i<n;i++) {
			a[i]=input.nextInt();
		}
		Arrays.sort(a);
		int b=0;
		for(int i=0;i<n;i++) {
			b=(a[n-k]);
		}
		System.out.println(b);
	}
}