1 寻找最大的k个数
输入包含n个整数的数组,输出其中最大的k个数。
要求:输出的数字不能重复,如果k大于可输出数字的个数,便输出该数组从大到小的不重复排列。
如:
输入数组 nums=[2,1,3,3,4,4,5] 和 k=3,则输出[5,4,3];
输入数组 nums=[2,1,3,3,4,4,5] 和 k=100,则输出 [5,4,3,2,1]。
解法一:暴力排列法
直接将整个数组排序,取最后k位,显然写起来简单,但是总的时间复杂高。比如使用快速排序,然后再遍历序列中前k个元素,总的复杂度达到 O(n * log n) + O(k) = O(n * log n)。
实现代码:
def max_k(nums, k):
nums = sorted(list(set(nums)))[::-1]
return nums[-k:]
解法二:排列k个数
仔细想想,我们并没有必要对整个数组排序。假设k给定为3,也就是说要返回最大的三个数,我们可以采取以下代码实现:
def max_three(nums):
"""
:type nums: List[int]
:rtype: int
"""
max1 = -sys.maxsize - 1
max2 = -sys.maxsize - 1
max3 = -sys.maxsize - 1
nums = list(set(nums))
for i in range(len(nums)):
if nums[i] > max1:
max3 = max2
max2 = max1
max1 = nums[i]
elif nums[i] > max2:
max3 = max2
max2 = nums[i]
elif nums[i] > max3:
max3 = nums[i]
if max3 != (-sys.maxsize - 1):
return max3
else:
return max1
即定义三个变量(初始值为最小整数),然后遍历数组中的元素,保证这三个变量是当前遍历的最大的三个元素。此时的时间复杂度为O(n)。
那么如果k是变量呢?我们可以采用同样的思路,定义一个长度为k+1的数组(每个元素初始值均为最小整数),遍历数组,将元素插入数组中合适的位置,时间复杂度为 n * O(k) = O(nk) 具体实现代码如下。
import sys
def max_k(nums, k):
arr_k = [-sys.maxsize - 1] * (k + 1)
nums_set = list(set(nums))
for i in range(len(nums_set)):
if nums_set[i] > arr_k[k]:
for j in range(k):
if arr_k[j] < nums_set[i]:
arr_k.insert(j, nums_set[i])
break
return arr_k[:min(k, len(nums_set))]
解法三:排列k个数(更优化)
参考一下快速排序的思想,在一个数组中选择一个基准点ÿ