剑指offer-python:37.求最小的k个数/最大的k个数

最小的k个数:

给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。

输入:[4,5,1,6,2,7,3,8],4 
返回值:[1,2,3,4]
说明:返回最小的4个数即可,返回[1,3,2,4]也可以

思路:快排(递归,二分法,分两段)

首先快排:

class Solution:
    def func0(self , nums):
        if len(nums) == []:
            return None
        start , end = 0 , len(nums)-1
        self.func1(nums , start , end)
        return nums

    def func1(self,nums , start , end):
        l , r = start , end
        if l >= r:
            return nums
        target = nums[start]   # target设置为数组的第一个数,也就是作为二分的中间值m,左边<m,右边>m
        while l<r:
            while l<r and nums[r] > target: # 分两段,把右边小于target的交换到左边
                r -= 1
            nums[l] , nums[r] = nums[r] , nums[l]
            while l<r and nums[l] <= target:  # 把左边大于target的交换到右边
                l += 1
            nums[l] , nums[r] = nums[r] , nums[l]
        nums = self.func1(nums , start ,l-1 )
        nums = self.func1(nums, r+1 , end)
        return nums

a = [30,24,5,58,18,36,12,42,39,44]
s = Solution()
print(s.func0(a))

 本题求最大/最小的k个数,再加个索引即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值