快排找数组中第K大的数

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

给定一个整数数组a,同时给定它的大小n和要找的K(1<=K<=n),请返回第K大的数(包括重复的元素,不用去重),保证答案存在。

-- coding:utf-8 --

sort()

class Solution:

def findKth(self, a, n, K):

# write code here

a.sort(reverse=True)

return a[K-1]

使用快排思想

class Solution:
    def findKth(self, a, n, K):
        result = self.quickSort(a, K)
        return result

	# 递归
    def quickSort(self, a, K):
        left = -1
        n = len(a)
        right = n - 1
        i = left + 1
        # 快排思想,一次循环将a分成三部分,左边比a[-1]小,中间等于a[-1],右边比a[-1]大!
        while i < right:
            if a[i] < a[-1]:
                left += 1
                a[i], a[left] = a[left], a[i]
                i += 1
            elif a[i] > a[-1]:
                right -= 1
                a[i], a[right] = a[right], a[i]
            else:
                i += 1
        a[-1], a[right] = a[right], a[-1]
        right += 1
        # 比a[-1]大的不足K个,但大于等于a[-1]的超过K个,直接返回a[-1]
        if (n - right) < K <= (n - left - 1):
            return a[left + 1]
        # 比a[-1]大的不少于K个,则从比a[-1]大的开始递归
        if (n - right) >= K:
            return self.quickSort(a[right:], K)
        # 大于等于a[-1]的不足K个,则从比a[-1]小的开始递归,并更新K值
        if (n - left - 1) < K:
            return self.quickSort(a[:left+1],K-(n - left - 1))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值