当前位置:   article > 正文

剑指offer-python:37.求最小的k个数/最大的k个数_不去重的k个数的数组

不去重的k个数的数组

最小的k个数:

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

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

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

首先快排:

  1. class Solution:
  2. def func0(self , nums):
  3. if len(nums) == []:
  4. return None
  5. start , end = 0 , len(nums)-1
  6. self.func1(nums , start , end)
  7. return nums
  8. def func1(self,nums , start , end):
  9. l , r = start , end
  10. if l >= r:
  11. return nums
  12. target = nums[start] # target设置为数组的第一个数,也就是作为二分的中间值m,左边<m,右边>m
  13. while l<r:
  14. while l<r and nums[r] > target: # 分两段,把右边小于target的交换到左边
  15. r -= 1
  16. nums[l] , nums[r] = nums[r] , nums[l]
  17. while l<r and nums[l] <= target: # 把左边大于target的交换到右边
  18. l += 1
  19. nums[l] , nums[r] = nums[r] , nums[l]
  20. nums = self.func1(nums , start ,l-1 )
  21. nums = self.func1(nums, r+1 , end)
  22. return nums
  23. a = [30,24,5,58,18,36,12,42,39,44]
  24. s = Solution()
  25. print(s.func0(a))

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/295199
推荐阅读
相关标签
  

闽ICP备14008679号