美文网首页
实现查找一个无序数组中第k大的元素

实现查找一个无序数组中第k大的元素

作者: 骆旺达 | 来源:发表于2021-08-27 01:30 被阅读0次

给定一个数组和k值,实现查找一个无序数组中第k个大的元素。
取值范围在[0,1000]

方法1: 哈希桶

import collections
class Solution:
    
    def findKthNum(self,nums,k):
        
    
        
        dic = collections.defaultdict(int)
        
        # 取值区间
        Max = 1000
        
        n = len(nums)
        
        for i in range(n):
            dic[nums[i]]+=1
        
        index = 0
        flag = True
        for j in range(0,Max):
            
            if dic[j]!=0:
                
                index+=dic[j]
                
                print("当前位置存放的元素",j,"一共重复了",dic[j],"次")
                
                if index>=k and flag:
                    flag=False
                    print("第",k,"位数为",j)

        
    
a = Solution()
a.findKthNum([0, 3, 1, 12,12,12,12, 34, 2, 6, 21, 78, 9,9,9,9],10)

输入
[0, 3, 1, 12, 12, 12, 12, 34, 2, 6, 21, 78, 9, 9, 9, 9]
输出


当前位置存放的元素 0 一共重复了 1 次
当前位置存放的元素 1 一共重复了 1 次
当前位置存放的元素 2 一共重复了 1 次
当前位置存放的元素 3 一共重复了 1 次
当前位置存放的元素 6 一共重复了 1 次
当前位置存放的元素 9 一共重复了 4 次
当前位置存放的元素 12 一共重复了 4 次
第 10 位数为 12
当前位置存放的元素 21 一共重复了 1 次
当前位置存放的元素 34 一共重复了 1 次
当前位置存放的元素 78 一共重复了 1 次

时间复杂度O(n)
空间复杂度O(d)

方法2:快拍提前终止

class Solution:
    def searchKthNum(self,nums,k):
        n = len(nums)
        self.quickSort(nums,0,n-1,k-1)
        return nums[k-1]
    
    def quickSort(self,nums,start,end,k):
        
        if start>=end:
        
            return 
        
        mid = nums[start]
        l,r = start,end
        
        while l<r:
            
            while l<r and nums[r]>=mid:
                r-=1
            
            nums[l],nums[r] = nums[r],nums[l]
            
            while l<r and nums[l]<mid:
                l+=1
            
            nums[l],nums[r] = nums[r],nums[l]
        
        nums[l] = mid
       
        if l==k:
            return 

        if l>k:
            self.quickSort(nums,start,l-1,k)
        else:
            self.quickSort(nums,l+1,end,k)
       
       
b = Solution()
b.searchKthNum([0, 3, 1, 12,12,12,12, 34, 2, 6, 21, 78, 9,9,9,9],10)

输出
12

时间复杂度:
O(n),如上文所述,证明过程可以参考「《算法导论》9.2:期望为线性的选择算法」。
空间复杂度:O(logn),递归使用栈空间的空间代价的期望为

相关文章

  • 算法分析 [最大/小值] 2019-02-28

    1. 数组,查找第k大值 215. 数组中的第K个最大元素(元素不重复无序) Kth Largest Elemen...

  • 实现查找一个无序数组中第k大的元素

    给定一个数组和k值,实现查找一个无序数组中第k个大的元素。取值范围在[0,1000] 方法1: 哈希桶 输入[0,...

  • 查找第 K 大的数

    题目 查找无序整数数组中第 K 大的元素。 示例 输入:[1, 0, 5, -1, 3, 2, 4], 3 输出:...

  • 2020-04-06

    针对215题,随机选择,找无序数组中第K 大的元素。 这里注意,非递归的实现,以及分区函数(独立写法)的左右双指针...

  • 大数据少资源的技巧

    61 lg(k)时间查找两个排序数组合并后第k小的元素 63 二维升序数组的快速查找 64 在海量数据中实现快速查...

  • lintcode 5 寻找第k大数

    5. 在数组中找到第k大的元素 在数组中找到第k大的元素 参考 先排序,再查找。最简单,但是最麻烦,如果不止一次的...

  • 算法导论公开课笔记(四)顺序统计、中值

    顺序统计 问题场景:给定具有n个元素的数组,已知数组是无序的,请找到第k小的元素并返回该元素(TOP K问题)。根...

  • LeetCode-215-数组中的第K个最大元素

    数组中的第K个最大元素 题目描述:给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。请...

  • 无序数组中的第k大元素:快速排序和堆排序

    找到无序数组中的第k大元素, kth_Largest_element_in_an_array。常见的解决方案有两种...

  • 解决TopK

    前言 TopK问题有以下几种常见形式 数组中的第K个最大元素动态添加的数组中的第K个最大元素数组中前k个最大的元素...

网友评论

      本文标题:实现查找一个无序数组中第k大的元素

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