算法学习(七)

算法# 学习目标:排序算法(二)

  • 学习内容:
  • 学习产出:
  • 选择排序
    • LeetCode 215 数组中的第K个最大元素
    • 题解
    • 代码(python)
  • 桶排序
    • LeetCode 347 前 K 个高频元素
    • 题解
    • 代码(python)

学习内容:

排序算法:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法

学习产出:

排序算法的变种

选择排序

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

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
  在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。      
    

题解

快速选择一般用于求解第K个元素,可以在O(n)时间复杂度,O(1)空间复杂度,与快速排序相似,只需找出第k大的元素即可,无需对左右进行排序

代码(python)

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        def quickselection(nums: List[int], l: int, r: int): #快速选择函数
            i,j = l+1,r
            while True:
                while i < r and nums[i] <= nums[l]:
                    i+=1
                while l < j and nums[j] >= nums[l]:
                    j-=1
                if i >= j: break
                nums[i],nums[j]=nums[j],nums[i]
            nums[l],nums[j]=nums[j],nums[l]
            return j
            
        l,r,target = 0,len(nums)-1,len(nums)-k
        while l < r:
            mid = quickselection(nums,l,r)
            if mid == target: return nums[mid]
            elif mid < target:
                l = mid + 1
            else:
                r = mid - 1
        return nums[l]
			

注:python内置函数sort会得到更为简单的方法

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        nums.sort()
        return nums[-k]
			

桶排序

LeetCode 347 前 K 个高频元素

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。      
    

题解

桶排序,为每个值设立一个桶,桶内记录这个值出现次数,然后对桶进行排序。在python中,就能用字典的形式来作为记录次数的桶。

代码(python)

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        map = {
     }
        for i in nums:
            map[i] = map.get(i,0) + 1    #生成字典映射
        max_time = max(map.values())
        TongList = [[] for i in range(max_time+1)] #根据最大次数生成桶
        for key, value in map.items():
            TongList[value].append(key) #将索引value放入key对应的字典索引
        res = []
        for i in range(max_time, 0, -1): #按桶索引排序
            if TongList[i]:
                res.extend(TongList[i])
            if len(res) >= k:
                return res[:k]
			

注:python字典运用

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        dict = collections.defaultdict(int)#默认字典
        b = []
        for w in nums: #统计list元素出现次数 {
     元素:次数}
            dict[w]+=1
        a=sorted(dict.items(),key=lambda x:x[1],reverse=True)[:k] #对次数排序,取出前k个最频繁的数字
        for i in a:
            b.append(i[0])
        return b
			

你可能感兴趣的:(算法,python)