剑指 Offer 40. 最小的k个数
class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
def partition(arr, l, r):
pivotvalue = arr[l]
lmark = l + 1
rmark = r
done = False
while not done:
while lmark <= rmark and arr[lmark] <= pivotvalue:
lmark += 1
while rmark >= lmark and arr[rmark] >= pivotvalue:
rmark -= 1
if rmark < lmark:
done = True
else:
arr[lmark], arr[rmark] = arr[rmark], arr[lmark]
arr[l], arr[rmark] = arr[rmark], arr[l]
return rmark
def quicksort(arr, l, r, k):
if l > r:
return
pos = partition(arr, l, r)
num = pos - l + 1
if k == num:
return
if k < num:
quicksort(arr, l, pos - 1, k)
else:
quicksort(arr, pos+1, r, k - num)
if k == 0:
return []
quicksort(arr, 0, len(arr) - 1, k)
return arr[:k]
215. 数组中的第K个最大元素
class Solution(object):
import heapq
def findKthLargest(self, nums, k):
left, right, target = 0, len(nums)-1, k-1
while True:
pos = self.partitions(nums, left, right)
if pos == target:
return nums[pos]
elif pos > target:
right = pos - 1
else:
left = pos + 1
def partitions(self, nums, left, right):
pivot = nums[left]
while left<right:
while left < right and nums[right] <= pivot:
right -= 1
nums[left] = nums[right]
while left < right and nums[left] >= pivot:
left += 1
nums[right] = nums[left]
nums[left] = pivot
return left