想到的第一个方法,遍历list,将第k大元素及比他大的存在单独的list中, 没有AC
def kthLargestElement(self, k, A):
if len(A) < k:
return None
tmp = [-float('inf')] * k
for i in range(len(A)):
j = 0
while j < k:
if A[i] < tmp[j]:
j += 1
else:
for m in range(k-1, j, -1):
tmp[m] = tmp[m-1]
tmp[j] = A[i]
break
i += 1
return tmp[-1]
查了下思路,看到利用快排的思想
class solution:
def kthLargestElement(self, A, k):
return self.findkth(A, 0, len(A)-1, k)
def findkth(self, array, left, right, k):
i = left
j = right
flag = array[left]
while i < j: # i=j represents sorted
while i < j and tmp >= array[j]: # descend order
j -= 1
if i < j:
array[i] = array[j]
i += 1
while i < j and tmp < array[i]:
i += 1
if i < j:
array[j] = array[i]
j -= 1
# i refers to (i+1)th largest
if i == k-1:
return tmp
elif i < k:
return self.findkth(array, i+1, right, k)
else:
return self.findkth(array, left, i-1, k)