题目:🔗
算法思想:
利用快排的左右元素排挤划分的思想。
假设数组大小为n, 要求得到第k个元素。
- 确定第一个元素的放置位置;
- 如果位置<(n-k) , 那就要往右区间再进一步搜索;
- 如果位置>(n-k), 那就要往左区间进一步搜索。
- 直到当前确定到index = n-k的元素, 直接返回该位置的元素即可。
class Solution:
def findKthLargest(self, nums, k: int) -> int:
# 注意是第k个最大的元素 那么就是从小到大的处于index = n-k 位置的元素
self.index = len(nums) - k
# 进入快排选择 index从0到n-1
return self.quickSelect(nums, 0, len(nums)-1)
def quickSelect(self, a, l, r):
# 得到当前划分后,l元素确定的位置
q = self.randomPartition(a, l, r)
# 如果刚好确定的是目标元素 直接返回即可
if q == self.index:
return a[q]
# 否则的话, 分情况进入左右子区间查找,确定新的位置元素
else:
return self.quickSelect(a, q+1, r) if q < self.index else self.quickSelect(a, l, q-1)
def randomPartition(self, a, l, r):
# 如果这里random一下 效果更好哦 最好o(n) 最坏o(n^2)
temp = a[l]
i, j = l+1, r
while i<=j:
while i<=j and a[i]<=temp:
i+=1
while i<=j and a[j]>temp:
j-=1
if i<=j: # 注意这里进行判断再swap哦
self.swap(a, i, j)
self.swap(a, l, j)
return j
def swap(self, a, i, j):
temp = a[i]
a[i] = a[j]
a[j] = temp