寻找第k大的数

 题目:🔗

算法思想:

利用快排的左右元素排挤划分的思想。

假设数组大小为n, 要求得到第k个元素。

  1. 确定第一个元素的放置位置;
  2.  如果位置<(n-k) , 那就要往右区间再进一步搜索;
  3. 如果位置>(n-k), 那就要往左区间进一步搜索。
  4. 直到当前确定到index = n-k的元素, 直接返回该位置的元素即可。
class Solution:
    def findKthLargest(self, nums, k: int) -> int:
        # 注意是第k个最大的元素 那么就是从小到大的处于index = n-k 位置的元素
        self.index = len(nums) - k
        # 进入快排选择 index从0到n-1
        return self.quickSelect(nums, 0, len(nums)-1)
    
    def quickSelect(self, a, l, r):
        # 得到当前划分后,l元素确定的位置
        q = self.randomPartition(a, l, r)
        # 如果刚好确定的是目标元素 直接返回即可
        if q == self.index:
            return a[q]
        # 否则的话, 分情况进入左右子区间查找,确定新的位置元素
        else:
            return self.quickSelect(a, q+1, r) if q < self.index else self.quickSelect(a, l, q-1) 
        
    def randomPartition(self, a, l, r):
       # 如果这里random一下 效果更好哦  最好o(n)  最坏o(n^2)
        temp = a[l]
        i, j = l+1, r
        while i<=j:
            while i<=j and a[i]<=temp:
                i+=1
            while i<=j and a[j]>temp:
                j-=1
            if i<=j: # 注意这里进行判断再swap哦
                self.swap(a, i, j)
        self.swap(a, l, j)
        return j
    
    def swap(self, a, i, j):
        temp = a[i]
        a[i] = a[j]
        a[j] = temp 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值