C++ 实现查找序列中第 k 大与第 k 小元素的方法及开发建议
### 🍎准备工作 要解决这个问题,你需要安装一个 C++ 编译器。如果你使用的是 Windows 系统,可以安装 MinGW 或者 Visual Studio;如果你使用的是 macOS,可以使用 Xcode 自带的 Clang 编译器;如果你使用的是 Linux 系统,通常系统已经预装了 GCC 编译器。 ### 💻代码实现 ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { int n, k; std::cin >> n >> k; std::vector<int> a(n); for (int i = 0; i < n; ++i) { std::cin >> a[i]; } // 对数组进行排序 std::sort(a.begin(), a.end()); // 第 k 小的元素 int kthSmallest = a[k - 1]; // 第 k 大的元素 int kthLargest = a[n - k]; std::cout << kthLargest << " " << kthSmallest << std::endl; return 0; } ``` ### 📖代码解释 1. **输入处理**:首先读取 `n` 和 `k`,然后读取 `n` 个正整数存储在 `vector` 中。 2. **排序**:使用 `std::sort` 函数对 `vector` 进行排序,默认是升序排序。 3. **获取第 k 小和第 k 大的元素**:由于数组已经升序排序,第 `k` 小的元素就是数组中索引为 `k - 1` 的元素,第 `k` 大的元素就是数组中索引为 `n - k` 的元素。 4. **输出结果**:将第 `k` 大的元素和第 `k` 小的元素输出,中间用空格分隔。 ### 🚀进阶使用指南 - **性能优化**:对于大规模数据,使用快速选择算法(如 `nth_element`)可以将时间复杂度从 $O(n log n)$ 降低到 $O(n)$。 ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { int n, k; std::cin >> n >> k; std::vector<int> a(n); for (int i = 0; i < n; ++i) { std::cin >> a[i]; } // 找到第 k 小的元素 std::nth_element(a.begin(), a.begin() + k - 1, a.end()); int kthSmallest = a[k - 1]; // 找到第 k 大的元素 std::nth_element(a.begin(), a.begin() + n - k, a.end()); int kthLargest = a[n - k]; std::cout << kthLargest << " " << kthSmallest << std::endl; return 0; } ``` - **错误处理**:可以添加输入验证,确保 `n` 和 `k` 在合法范围内,以及输入的元素在 `1` 到 `10^4` 之间。 - **扩展功能**:可以修改代码,处理有重复元素的情况。 ### 📚学习资源 - **官方文档**:[C++ 官方文档](https://en.cppreference.com/w/) - **参考书籍**:《C++ Primer》《Effective C++》 ### 💡开发建议 - **代码可读性**:使用有意义的变量名,添加必要的注释,提高代码的可读性。 - **边界检查**:在读取输入时,要进行边界检查,确保输入数据的合法性。 - **性能优化**:对于大规模数据,选择合适的算法可以显著提高程序的性能。 ######[AI写代码神器 | 893点数解答 | 2026-06-06 19:55:45]
- Java 实现计算机硬件模拟:从 PCI 设备到主板、计算机的启动与关闭(字节豆包 | 716点数解答 | 2024-12-08 23:38:38)369
- Java 代码:模拟计算机主板启动与关闭 PCI 设备全流程(字节豆包 | 637点数解答 | 2024-12-09 08:31:54)332
- 求解特定条件下整数序列的最小值:算法分析与代码实现(字节豆包 | 746点数解答 | 2026-01-24 13:14:40)84
- Java 实战:Vehicle 类与 User 类实现机动车速度功率控制( | 968点数解答 | 2024-03-12 11:26:25)576
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)410
- Java 实战:动物类、接口与继承实现鸟儿吃虫和飞翔功能(字节豆包 | 183点数解答 | 2024-09-19 15:53:55)324
- Java 实战:动物类、接口与继承,实现鸟儿吃虫与飞翔功能(字节豆包 | 184点数解答 | 2024-09-19 16:45:48)340
- Java 实现 BankAccount 类:账户余额管理与测试全解析(字节豆包 | 420点数解答 | 2024-10-11 08:48:21)345
- Java 编程:实现教师与学生类的创建、继承及属性操作(字节豆包 | 745点数解答 | 2024-10-16 18:40:42)429
- Java 实现 Circle 类:全面封装圆的属性与方法(字节豆包 | 256点数解答 | 2024-10-27 16:34:37)270
- Java 实现继承关系:Fu 类、Zi 类与测试类 Example04 代码解析及注意要点(字节豆包 | 251点数解答 | 2024-12-12 09:36:45)268
- Java实现银行账户类:含账户余额操作与测试代码(DeepSeek | 711点数解答 | 2025-03-23 21:38:57)283