AcWing 786. 第k个数-python3
原题链接
简单
作者:
Actor丶
,
2020-03-07 23:35:01
,
所有人可见
,
阅读 637
"""
基本思想:
借助快排模板,最后判断左半部分的元素个数和k的相对大小:
1. 如果[l,j]的元素个数大于等于k,则搜索左半边
2. 如果[l,j]的元素个数小于k,则搜索右半边的第k-(j-l+1)个
"""
def quickSort(l, r, k):
if l>=r: return nums[l]
i = l-1
j = r+1
mid = nums[(l+r)//2] # !!!出错:边界值mid的计算放在循环外面
while i<j:
while 1:
i+=1
if nums[i]>=mid:
break
while 1:
j-=1
# print(j)
if nums[j]<=mid:
break
if i<j:
nums[i], nums[j] = nums[j], nums[i]
if j-l+1>=k: # 如果[l,j]的元素个数大于等于k,则搜索左半边
return quickSort(l,j,k) # !!!注意:当递归函数想返回值时,一定要return;如果函数是对数组进行操作,则没必要return
else: # 如果[l,j]的元素个数小于k,则搜索右半边的第k-(j-l+1)个
return quickSort(j+1,r,k-j+l-1)
if __name__=="__main__":
n, k = map(int, input().split())
nums = list(map(int, input().split()))
res = quickSort(0, n-1, k)
print(res)