题解 | #最小的K个数#
最小的K个数
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf
#coding:utf-8
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param input int整型一维数组
# @param k int整型
# @return int整型一维数组
#
# ** 思考:快排和快速选择到底有什么不同?
class Solution:
def GetLeastNumbers_Solution(self , input , k ):
# write code here
ret = []
n = len(input)
if k == 0 or k > n:
return ret
self.qs(input, k, 0, n - 1)
for i in range(0, k):
ret.append(input[i])
return ret
def qs(self, arr, k, left, right):
if left == right or left >= len(arr):
return
i = left
j = right
pivot_val = arr[left]
while i < j:
#右边找出第一个小于pivot_val的
while i < j and arr[j] >= pivot_val:
j -= 1
#左边找出第一个大于pivot_val的
while i < j and arr[i] <= pivot_val:
i += 1
self.swap(arr, i, j)
self.swap(arr, i, left) #把left当做pivot
#若i > k, 往i前找
if i > k:
self.qs(arr, k, left, i - 1)
#若i < k, 往i后找
if i < k:
self.qs(arr, k, i + 1, right)
return
def swap(self, arr, i, j):
tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
return
查看6道真题和解析