news 2026/4/30 13:35:55

LeetCode 顺序统计量选择题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 顺序统计量选择题解

LeetCode 顺序统计量选择题解

题目描述

实现顺序统计量选择算法,在一个整数数组中查找第 k 小的元素。

示例

输入:[64, 34, 25, 12, 22, 11, 90],k = 3
输出:22(第 3 小的元素)

解题思路

方法:快速选择算法

思路

  • 快速选择算法的核心思想是基于快速排序的分区操作,通过不断缩小搜索范围来找到第 k 小的元素。
  • 具体步骤:
    1. 选择一个基准元素。
    2. 对数组进行分区,将小于基准元素的元素放在左边,大于基准元素的元素放在右边。
    3. 根据基准元素的位置判断第 k 小的元素在哪个分区:
      • 如果基准元素的位置等于 k-1,则基准元素就是第 k 小的元素。
      • 如果基准元素的位置大于 k-1,则第 k 小的元素在左分区。
      • 如果基准元素的位置小于 k-1,则第 k 小的元素在右分区。
    4. 递归地在相应的分区中查找第 k 小的元素。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。平均情况下,每次分区都会将搜索范围减半。
  • 空间复杂度:O(log n),需要额外的空间来存储递归调用的栈。

代码实现

方法:快速选择算法

# 快速选择算法 def quick_select(arr, k): if k < 1 or k > len(arr): return None return quick_select_helper(arr, 0, len(arr) - 1, k - 1) def quick_select_helper(arr, left, right, k): if left == right: return arr[left] # 分区,返回基准元素的位置 pivot_idx = partition(arr, left, right) if pivot_idx == k: return arr[pivot_idx] elif pivot_idx > k: return quick_select_helper(arr, left, pivot_idx - 1, k) else: return quick_select_helper(arr, pivot_idx + 1, right, k) # 分区函数 def partition(arr, left, right): # 选择基准元素(这里选择最后一个元素) pivot = arr[right] i = left - 1 for j in range(left, right): if arr[j] <= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1], arr[right] = arr[right], arr[i + 1] return i + 1 # 测试 def test_quick_select(): arr = [64, 34, 25, 12, 22, 11, 90] print(quick_select(arr.copy(), 1)) # 输出:11 print(quick_select(arr.copy(), 3)) # 输出:22 print(quick_select(arr.copy(), 7)) # 输出:90 if __name__ == "__main__": test_quick_select()

测试用例

测试用例 1:基本情况

输入:[64, 34, 25, 12, 22, 11, 90],k = 3
输出:22

测试用例 2:k = 1(最小元素)

输入:[64, 34, 25, 12, 22, 11, 90],k = 1
输出:11

测试用例 3:k = n(最大元素)

输入:[64, 34, 25, 12, 22, 11, 90],k = 7
输出:90

总结

快速选择算法是一种高效的顺序统计量选择算法,它通过基于快速排序的分区操作来找到第 k 小的元素。快速选择算法的平均时间复杂度为 O(n),比排序后再选择的方法更高效。

快速选择算法的核心思想是:通过分区操作不断缩小搜索范围,直到找到第 k 小的元素。

掌握快速选择算法的原理和实现,对于理解顺序统计量选择问题非常重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 13:34:22

C# WinForm串口调试助手实战:手把手教你用SerialPort类搞定RS485/232通信

C# WinForm串口调试助手实战&#xff1a;从零构建工业级通信工具 1. 项目规划与基础环境搭建 在工业自动化、物联网设备调试等领域&#xff0c;串口通信依然是最基础且广泛使用的数据传输方式之一。相比网络通信&#xff0c;串口通信具有配置简单、响应实时性强、硬件成本低等优…

作者头像 李华
网站建设 2026/4/30 13:30:24

MIKE IO完全指南:5分钟掌握Python水文数据处理核心技能

MIKE IO完全指南&#xff1a;5分钟掌握Python水文数据处理核心技能 【免费下载链接】mikeio Read, write and manipulate dfs0, dfs1, dfs2, dfs3, dfsu and mesh files. 项目地址: https://gitcode.com/gh_mirrors/mi/mikeio MIKE IO是DHI集团开发的Python开源库&#…

作者头像 李华
网站建设 2026/4/30 13:26:41

从DFMEA到软件设计:如何像造汽车一样‘预防性’设计你的代码?

从DFMEA到软件设计&#xff1a;如何像造汽车一样‘预防性’设计你的代码&#xff1f; 在汽车制造业中&#xff0c;一个螺栓的失效可能导致整车的召回&#xff1b;而在软件系统中&#xff0c;一行代码的漏洞同样可能引发线上事故。传统软件开发往往陷入"编码-测试-修复&qu…

作者头像 李华
网站建设 2026/4/30 13:22:23

AAEON PICO-ARU4 Pico-ITX SBC:边缘计算与AI推理的紧凑解决方案

1. AAEON PICO-ARU4 Pico-ITX SBC深度解析在嵌入式系统和工业计算领域&#xff0c;小型化与高性能的结合一直是开发者追求的目标。AAEON最新推出的PICO-ARU4单板计算机&#xff08;SBC&#xff09;将Intel最新的Arrow Lake处理器塞进了仅100x72mm的Pico-ITX规格板卡中&#xff…

作者头像 李华