腾讯35-数组中的第K个最大元素

腾讯35-数组中的第K个最大元素leetcode215

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

一定能利用快排的partition函数
接下来就是正确的写出partition函数
python写partition函数8行,其中1,2,7,8行都好记,
第一行,pivot取第一个元素值left,
第二行,移动的j也从left开始(保证nums[j]本身一定是小于等于pivot,初始是等于)
第3行注意范围,i从left+1开始,因为pivot所在点不需要与自己比较
第4行注意,nums[i]和pivot比较,等号不参与,nums[i]小于pivot有操作,nums[i]向前移动,向前与j 有关
第五行最重要,因为nums[j]本身一定是小于等于pivot(nums[j]的初值也证明这一点),所以不需要直接把与nums[j]与nums[i]做交换,而nums[j+1]就不一定了,nums[j +1]可以大于小于等于pivot,且一定有,如果nums[j +1]<pivot,时j+1=i,这时交换了nums[j +1]与nums[i]也没关系,如果nums[j +1]>pivot,这时交换了nums[j +1]与nums[i]就更合理了。综上,可以理解第五步为什么有j=j+1
第六行完成nums[j]与nums[i]的交换(此时j已经是加过1的了)
第七行把初始left和移动的j交换位置(同样验证了上面的nums[j]本身一定是小于等于pivot,而nums[j+1]不一定)
返回j,pivot 所在的下标

class Solution:
    def partition(self,nums,left,right):
        pivot=nums[left]
        nums[left],nums[right]=nums[right],nums[left]
        store_index=left
        for i in range(left,right+1):
            if nums[i]<pivot:
                nums[store_index],nums[i]=nums[i],nums[store_index]
                store_index+=1
        nums[store_index],nums[right]=nums[right],nums[store_index]
        return store_index
    
    def findKthLargest(self, nums: List[int], k: int) -> int:
        ture_k=len(nums)-k
        left,right=0,len(nums)-1
        while(True):
            tmp=self.partition(nums,left,right)
            if tmp==ture_k:return nums[tmp]
            elif tmp<ture_k:left=tmp+1
            else:right=tmp-1
发布了93 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zlb872551601/article/details/103649781