这里给出两种思路
第一、基于Partition函数的方法
Partition函数可以对一个list进行调换顺序
使得这个list在调换后,呈现的状态为
LIST = LIST1 + [A] + LIST2
其中LIST1中所有元素都不大于A,LIST2中所有元素都不小于A
因此,我们只需先以LIST中任一个元素(如第一个元素)为A,
进行一次排序,看看A是LIST中排第几大的元素。
若A为第m大,m=k,返回A
若A为第m大,m>k,我们只需要对LIST2再执行partition函数即可
若A为第m大,m<k,我们只需要对LIST1再执行partition函数即可
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
dijida,temp,dy,xy,index = self.partition(nums)#,index
if dijida == k:
return temp
lastlen = 0
while dijida != k:
if dijida > k:
dijida,temp,dy,xy,index = self.partition(dy)
if index == 1:
return temp
elif dijida < k:
lastlen += len(dy)+1
dijida,temp,dy,xy,index = self.partition(xy)
dijida += lastlen
if index == 1:
return temp
return temp
def partition(self,inputlist):
if len(inputlist) == 1:
return 1,inputlist[0],[],[],1
temp = inputlist[0]
xiaoyulist = []
dayulist = []
length = len(inputlist)
for i in range(length-1):
if inputlist[i+1] > temp:
dayulist.append(inputlist[i+1])
else:
xiaoyulist.append(inputlist[i+1])
return len(dayulist) + 1,temp,dayulist,xiaoyulist,0
第二种,基于堆的方法,待补充