题解 | #输入n个整数,输出其中最小的k个#
输入n个整数,输出其中最小的k个
http://www.nowcoder.com/practice/69ef2267aafd4d52b250a272fd27052c
题目分析
- 题目给出我们n个数字
- 我们要对n个数字进行排序,并且最终输出前k个最小的数字
方法一:调用库函数
- 实现思路
- 首先整理输入数据成列表或变量等
- 然后进行排序
- 按序输出前k个结果即可
while True:
try:
n,k = map(int, input().split()) # 返回迭代器
nums = list(map(int, input().split())) # 返回数组
nums.sort() # 排序
print(" ".join(map(str, nums[:k]))) # 组织成输出
except:
break
复杂度分析
- 时间复杂度:,由于库函数中sort函数采用快速排序的方式,因此时间代价在这个量级
- 空间复杂度:,只有常量级别的空间代价开销
方法二:选择排序
- 实现思路
-
我们对于前k个数组元素进行操作
-
每次对第i个元素遍历到的时候,往后继续遍历,挑出最小值与位置i的元素交换
-
最终输出前k个元素即可
-
while True:
try:
n,k = map(int, input().split()) # 返回迭代器
nums = list(map(int, input().split())) # 返回数组
for i in range(k): # 对前k个元素进行遍历
mn = nums[i] # 存储当前第i个元素
pos = i # 存储索引
for j in range(i+1, len(nums)): # 从i后面的元素中挑选最小值和位置i交换
if nums[j] < mn:
mn = nums[j]
pos = j
nums[pos] = nums[i]
nums[i] = mn
print(" ".join(map(str, nums[:k]))) # 组织成输出前k个
except:
break
复杂度分析
- 时间复杂度:,我们只要挑选k次最小的元素即可,但是每次都需要遍历一遍整个数组
- 空间复杂度:,只有常量空间代价的开销