美文网首页剑指offer- python实现
面试题40:最小的k个数

面试题40:最小的k个数

作者: 不会编程的程序猿甲 | 来源:发表于2020-03-23 13:45 被阅读0次

    题目:
    输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

    思路一:
    利用python的列表操作 sort(),对其数字排序,然后取出前k个元素,复杂度O(nlogn)。

    代码实现一:

    # -*- coding:utf-8 -*-
    class Solution:
        def GetLeastNumbers_Solution(self, tinput, k):
            # write code here
            if not tinput or len(tinput)<=0 or k > len(tinput):
                return []
            tinput.sort()
            return tinput[:k]
    

    思路二:
    利用堆进行解决,python中有heapq包,可以取出最小的k个元素,复杂度为O(n*logk)

    代码实现二:

    # -*- coding:utf-8 -*-
    class Solution:
        def GetLeastNumbers_Solution(self, tinput, k):
            # write code here
            if not tinput or len(tinput)<=0 or k > len(tinput):
                return []
            import heapq
            return heapq.nsmallest(k,tinput)
    

    思路三:
    自己实现快速排序的思路,以便于巩固,递归实现。(需要额外空间)

    代码实现三:

    # -*- coding:utf-8 -*-
    class Solution:
        def GetLeastNumbers_Solution(self, tinput, k):
            # write code here
            if not tinput or len(tinput)<=0 or k > len(tinput):
                return []
            def quickSort(tinput):
                if not tinput:    #递归结束条件
                    return []
                if len(tinput) == 1:
                    return tinput
    
                pirvot = tinput[0]
                left = quickSort([x for x in tinput[1:] if x <= pirvot])
                right = quickSort([x for x in tinput[1:] if x> pirvot])
                return left + [pirvot] + right
            return quickSort(tinput)[:k]
    

    思路四:
    自己实现快速排序,不需要额外空间的方法

    代码实现4:

    # -*- coding:utf-8 -*-
    class Solution:
        def GetLeastNumbers_Solution(self, tinput, k):
            # write code here
            if not tinput or len(tinput)<=0 or k > len(tinput):
                return []
    
            #不分配临时数组的快速排序方法
            def quicksort2(nums, left, right):
                if left < right:   #结束条件
                    q = partion(nums, left, right)
                    quicksort2(nums, left, q-1)
                    quicksort2(nums, q+1, right)
    
            def partion(nums, left, right):
                pivot = nums[right]
                i = left-1
                for j in range(left,right):
                    if nums[j] < pivot:
                        i+=1
                        nums[i],nums[j] = nums[j],nums[i]   #将小于pivot的值移动到左边小于序列的下一个
                nums[i+1],nums[right] = nums[right],nums[i+1]  #主元位置归位
                return i+1
    
            quicksort2(tinput,0,len(tinput)-1)
            return tinput[:k]
    

    提交结果:

    思路一提交结果 思路二提交结果 思路三提交结果 思路四提交结果

    相关文章

      网友评论

        本文标题:面试题40:最小的k个数

        本文链接:https://www.haomeiwen.com/subject/ozqwyhtx.html