问题描述
我想编写代码以便可以使用快速排序找到第k个最大数字,并在LeetCode中编写以下内容,LeetCode将首先调用findKthLargest
class Solution(object):
def partition(self,arr,left,right):
piv = arr[right]
i = left-1
counter = left
while (counter<right):
if (arr[counter]<piv):
i = i+1
tmp = arr[counter]
arr[counter]=arr[i]
arr[i]=tmp
counter = counter+1
temp = arr[i+1]
arr[i+1]=arr[right]
print('pivot '+str(piv)+' at '+str(i+1))
arr[right]=temp
print("at the nmoment "+str(arr))
return (i+1)
def helper(self,right,k):
if (left>=right):
return
p = self.partition(arr,right)
print("p is now "+str(p))
if (p==len(arr)-k):
return int(arr[p])
self.helper(arr,p-1,k)
self.helper(arr,p+1,k)
def findKthLargest(self,nums,k):
f= self.helper(nums,len(nums)-1,k)
print(f)
我什至在辅助方法内打印(arr [p]),它给了我正确的答案,但是在方法findKthLargest内,变量f显示为none类型,我想知道哪里出了问题?目前,我认为它返回的是null类型,因为在检查辅助方法内部的(left> = right)是否不返回时,在递归循环内部
解决方法
问题是您的helper
函数并不总是返回值。仅在if
条件为true的基本情况下,它会返回一个数字值。但是它也应该在进行相应的递归调用时返回相同的数字。
所以改变:
self.helper(arr,left,p-1,k)
self.helper(arr,p+1,right,k)
收件人:
result = self.helper(arr,k)
if result is not None:
return result
return self.helper(arr,k)
这样,最深的返回值将使递归树冒泡,并且在第一次递归调用中成功执行将避免进行第二次递归调用。
,很难调试您的代码,尽管使用较少的语句即可通过:
class Solution:
def findKthLargest(self,nums,k):
def kth_smallest(nums,k):
if nums:
pos = partition(nums,len(nums) - 1)
if k > pos + 1:
return kth_smallest(nums[pos + 1:],k - pos - 1)
elif k < pos + 1:
return kth_smallest(nums[:pos],k)
else:
return nums[pos]
def partition(nums,right):
res = left
while left < right:
if nums[left] < nums[right]:
nums[left],nums[res] = nums[res],nums[left]
res += 1
left += 1
nums[res],nums[right] = nums[right],nums[res]
return res
return kth_smallest(nums,len(nums) + 1 - k)