leetcode刷题之排序

215.数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

# 堆
import heapq
# heapq模块提供的堆是一个最小堆(小顶堆)。这意味着堆中的最小元素总是位于堆顶
# 因此,当你在堆中插入元素时,它会根据堆的规则自动调整,以确保最小元素位于堆顶
class Solution(object):
    def findKthLargest(self, nums, k):
        heap = [] # 创建了一个空列表 使用它来表示堆
        heapify(heap) # 将列表转换为堆的形式
        for num in nums: #遍历数组nums中的每一个元素
          heappush(heap, num) # 将元素num插入进堆heap中
          if len(heap) > k: # 这里检测堆的大小是否超过了K 
             heappop(heap) # 将堆顶元素(即最小元素)弹出
    # 最终堆顶元素即为第 k 个最大的元素
        return heap[0]

347.出现频率最多的 k 个元素

import collections
class Solution(object):
    def topKFrequent(self, nums, k):
        # 统计每个元素的频率
        # collections.Counter(nums)是创建一个计数器对象 统计 nums 中每个元素的出现次数
        # 假设 nums = [1, 2, 2, 3, 3, 3],则结果将是一个字典 Counter({3: 3, 2: 2, 1: 1})
        counter = collections.Counter(nums)
        #创建了一个包含了 len(nums) + 1 个空列表的列表
        buckets = [[] for _ in range(len(nums) + 1)]
        # 把元素放到对应频率的桶中
        for num, freq in counter.items(): # 遍历 counter 对象中的每个元素以及它们的频率
         buckets[freq].append(num)
         # 逆序遍历桶,得到频率前 k 高的元素
        result = []
        # 0:这是循环的终止条件,表示循环直到索引为 0 的位置
        # -1:这是循环的步长,表示每次迭代向前移动一个位置
        for i in range(len(buckets) - 1, 0, -1): # 从最后一个非空的桶开始,逆序遍历整个桶列表。
          result.extend(buckets[i])
          if len(result) >= k:
              break
        return result[:k]

451.根据字符出现频率排序
给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。返回 已排序的字符串 。如果有多个答案,返回其中任何一个。

class Solution(object):
    def frequencySort(self, s):
        res = '' # 空字符串 res 用于保存排序后的结果
        d = {} # 空字典 d 用于统计每个字符的出现次数
        # 遍历字符串 记录每个字符出现的次数
        for c in s:
            if c not in d:
                d[c] = 1
            else:
                d[c] += 1
        # 定义列表 列表长度等于字符串长度+1 防止字符串都是同一个字符
        l = ['' for _ in range(len(s) + 1)]
        for key, value in d.items():
            l[value] += key * value 
            #将字符 key 重复 value 次后,将结果添加到列表 l 的第 value 个位置上 
        for i in range(len(l)-1, -1, -1):
            # len(l)-1 得到的是列表 l 的最后一个元素的索引
            # range() 函数从该索引开始往前生成索引,一直到 -1(不包含 -1),步长为 -1
            # 这样就实现了倒序遍历列表的效果
            if l[i] != '':
                res += l[i]
            # 将列表 l 中的非空字符串按照倒序的顺序添加到结果字符串 res 的末尾。

        return res

75. 颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

class Solution(object):
    def sortColors(self, nums):
        # 初始时候 i 指向第一个位置,k指向最后一个位置
        i = 0
        j = 0
        k = len(nums) - 1
        while j <= k:
            if nums[j] == 0:
                nums[i],nums[j] = nums[j],nums[i]
                j += 1
                i += 1
            elif nums[j] == 1:
                j += 1
            else:
                nums[j],nums[k] = nums[k],nums[j]
                k -= 1
        return nums   

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值