NC119 最小的K个数
描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。
数据范围:0≤k,n≤10000,数组中每个数的大小0≤val≤1000
要求:空间复杂度 O(n) ,时间复杂度 O(nlogn)
思路:这题挺简单的,就是定义一个数组result存放要返回的结果,result升序排列。从input中取出一个数i,如果 i >= result[k-1],就不操作。如果 i < result[k-1]就把i存放到result中,用二分的方式存入,存入后若len(result)比k大,则删除最后一个元素。
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param input int整型一维数组
# @param k int整型
# @return int整型一维数组
#
class Solution:
@staticmethod
def insertArr(result,i):
if len(result) == 0:
result.append(i)
return result
left = 0
right = len(result) - 1
middle = (left + right) >> 1
while left < right:
middle = (left + right) >> 1
if result[middle] == i:
result.insert(middle,i)
return result
elif result[middle] < i:
if result[middle + 1] > i:
result.insert(middle + 1, i)
return result
left = middle + 1
else:
if result[middle - 1] < i:
result.insert(middle, i)
return result
right = middle - 1
if result[left] < i:
result.insert(left + 1, i)
else:
result.insert(left, i)
def GetLeastNumbers_Solution(self , input: List[int], k: int) -> List[int]:
# write code here
result = []
if k == 0:
return []
for i in input:
if len(result) < k:
self.insertArr(result,i)
elif i < result[k-1]:
self.insertArr(result,i)
result.pop()
return result