pythonlog数组_[Python] 算法心得—数组篇

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个数(更优化)

参考一下快速排序的思想,在一个数组中选择一个基准点ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值