牛客刷题——第K大的数

题目:

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

 这个的题目中提示采用快速排序的方法进行查找,在快排的时候,通过左右指针和a[end]的比较,以及right和left左右数的交换,最后能够得到第left小的数是a[end]。(这里要注意,由于是升序排序,所以得到的数是第k小,而不是第k大,当时这一块没想明白,调试了好久)。所以可以换个思路,按照降序排序的思路写快排,left找比a[end]小的数,right找比a[end]大的数,然后交换,这样通过降序排序的思路,就可以得到第left大的数是a[end],然后比较left+1和K的值,小于的话往右边找,大于的话往左边找,等于则直接返回当前值。

完整代码如下:

public int findKth(int[] a, int n, int K) {
        // write code here
		return find(0, n-1, a, K);
    }
public int find(int begin,int end,int[] a,int n ) {
		int p = partition(begin, end, a);  //找到的第p大的数
		
		if(p+1>n) {
			return find(begin, p-1, a, n);
		}else if(p+1<n){
			return find(p+1, end, a, n);
		}else {
			return a[p];
		}
	}
	public int partition(int begin,int end,int[] a) {
		if(begin>end) {
			return -1;
		}
		int i=begin,j=end;
		int key = a[end];
		while(i<j) {
			while(i<j&&a[i]>=key) {
					i++;
			}
			while(i<j&&a[j]<=key) {
					j--;
			}
			swap(i,j,a);
		}
		swap(i, end, a);
		return i;
	}
	public void swap(int i,int j ,int[]a) {
		int temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值