先写个快排练下手
https://leetcode-cn.com/problems/sort-an-array/submissions/
class Solution(object):
def partition(self, nums, begin, end):
"""
用nums[0]作为锚点,这个函数的作用是返回nums[0]应该在的位置pos
"""
target = nums[end]
i = begin - 1
for j in range(begin, end):
if nums[j] <= target:
i = i + 1
nums[i], nums[j] = nums[j], nums[i]
nums[i+1], nums[end] = nums[end], nums[i+1]
return i+1
return pos
def quickSort(self, nums, begin, end):
"""
对begin,end范围内数组进行排序
"""
if begin >= end:
return
pos = self.partition(nums, begin, end)
self.quickSort(nums, begin, pos-1)
self.quickSort(nums, pos+1, end)
return
def sortArray(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
# 写个快排
# 快排复杂度nlogn,空间没有额外增加,会更改原数组
self.quickSort(nums, 0, len(nums) - 1)
return nums
找第k大元素,用快排思想,找到位置为k的锚点后可退出,这个锚点就是要选定的元素
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/submissions/
class Solution(object):
def parition(self, nums, begin, end):
target = nums[end]
i = begin - 1
for j in range(begin, end):
if nums[j] <= target:
i += 1
nums[i], nums[j] = nums[j], nums[i]
i += 1
nums[end], nums[i] = nums[i], nums[end]
return i
def quickSelect(self, nums, begin, end, index):
"""
进行锚点和index对比,如果锚点找到位置刚好是index,则递归结束,锚点就是需要找的第k大元素
"""
pos = self.parition(nums, begin, end)
if pos == index:
return nums[index]
else:
if pos < index:
return self.quickSelect(nums, pos + 1, end, index)
else:
return self.quickSelect(nums, begin, pos - 1, index)
return -1
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
# 用快排的parition思想进行操作
return self.quickSelect(nums, 0, len(nums) - 1, len(nums) - k)
其实远不如python自带sort快
class Solution(object):
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
nums.sort()
return nums[-k]