【剑指offer】题目1371:最小的K个数
来源:互联网 发布:php防sql注入原理 编辑:程序博客网 时间:2024/05/16 18:44
- 题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
- 输入:
每个测试案例包括2行:
第一行为2个整数n,k(1<=n,k<=200000),表示数组的长度。
第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]。
- 输出:
对应每个测试案例,输出最小的k个数,并按从小到大顺序打印。
- 样例输入:
8 44 5 1 6 2 7 3 8
- 样例输出:
1 2 3 4
基于快速排序划分的思路,平均时间复杂度O(n)
#include <iostream>#include <string>#include <cstdio>#include <cstdlib>#include <algorithm>void swap(int *a, int *b){int tmp = *a;*a = *b;*b = tmp;}int Partition(int data[],int length, int lhs, int rhs){if (data == NULL || length <= 0 || lhs < 0 || rhs >= length){return -1;}int pivot = data[rhs];int small = lhs - 1;for (int i = lhs; i < rhs; i++){if (data[i] < pivot){small++;if (small != i){swap(&data[i], &data[small]);}}}small++;swap(&data[small], &data[rhs]);return small;}void GetleastKnumber(int *data, int n, int k){if (data == NULL || n <= 0 || k <= 0){return;}if (k >= n){std::sort(data, data+n);for (int i = 0; i < n; i++){if (i > 0){printf(" ");}printf("%d", data[i]);}printf("\n");return ;}int lhs = 0, rhs = n-1;int index = Partition(data, n, lhs, rhs);while(k-1 != index){if (k-1 < index){rhs = index -1;index = Partition(data, n, lhs, rhs);}else{lhs = index + 1;index = Partition(data, n, lhs, rhs);}}std::sort(data, data+k);for (int i = 0; i < k; i++){if (i > 0){printf(" ");}printf("%d", data[i]);}printf("\n");return ;}int GetKthSmallNum(int *data, int n, int k){return 0;}int main(){int n, k;while(scanf("%d %d", &n, &k) != EOF){int *data = new int[n];if (data == NULL){break;}for (int i = 0; i < n; i++){scanf("%d", &data[i]);}GetleastKnumber(data, n, k);delete[] data;}//system("pause");return 0;}
#include <iostream>#include <string>#include <cstdio>#include <cstdlib>#include <algorithm>void swap(int *a, int *b){int tmp = *a;*a = *b;*b = tmp;}int Partition(int data[],int length, int lhs, int rhs){if (data == NULL || length <= 0 || lhs < 0 || rhs >= length){return -1;}int pivot = data[rhs];int small = lhs - 1;for (int i = lhs; i < rhs; i++){if (data[i] < pivot){small++;if (small != i){swap(&data[i], &data[small]);}}}small++;swap(&data[small], &data[rhs]);return small;}void GetleastKnumber(int *data, int n, int k){if (data == NULL || n <= 0 || k <= 0){return;}if (k >= n){std::sort(data, data+n);for (int i = 0; i < n; i++){if (i > 0){printf(" ");}printf("%d", data[i]);}printf("\n");return ;}int lhs = 0, rhs = n-1;int index = Partition(data, n, lhs, rhs);while(k-1 != index){if (k-1 < index){rhs = index -1;index = Partition(data, n, lhs, rhs);}else{lhs = index + 1;index = Partition(data, n, lhs, rhs);}}std::sort(data, data+k);for (int i = 0; i < k; i++){if (i > 0){printf(" ");}printf("%d", data[i]);}printf("\n");return ;}int GetKthSmallNum(int *data, int n, int k)// 函数返回第K小的数{if (data == NULL || k > n){return -1;}int lhs = 0, rhs = n-1;int index = Partition(data, n, lhs, rhs);while(index != k-1){if(k-1 < index){rhs = index -1;index = Partition(data, n, lhs , rhs);}else{lhs = index + 1;index = Partition(data, n, lhs , rhs);}}return data[index];}int main(){int n, k;while(scanf("%d %d", &n, &k) != EOF){int *data = new int[n];if (data == NULL){break;}for (int i = 0; i < n; i++){scanf("%d", &data[i]);}//GetleastKnumber(data, n, k);GetKthSmallNum(data, n, k);delete[] data;}//system("pause");return 0;}
0 0
- 【剑指offer】题目1371:最小的K个数
- 【剑指Offer面试编程题】题目1371:最小的K个数--九度OJ
- 剑指offer:最小的k个数
- 【剑指offer】最小的k个数
- 剑指offer-30:最小的k个数
- 最小的k个数(剑指offer)
- 剑指offer--最小的K个数
- 剑指Offer之 - 最小的k个数
- 剑指offer-30 最小的K个数
- 剑指offer之最小的k个数
- 剑指offer 30 - 最小的k个数
- 《剑指offer》最小的K个数
- 【剑指Offer】最小的K个数
- 剑指offer—最小的K个数
- 剑指Offer-30-最小的k个数
- 剑指offer:最小的K个数
- 【剑指offer】之最小的k个数
- [剑指offer:30]最小的k个数
- 常用的freemarker标签语法
- 学习使用Python搭建Web应用(win)
- ObjectARX学习笔记(十四)--枚举CAD命令行子窗口acedGetAcadTextCmdLine();
- vim自动补全插件-NeoComplCache
- 【LeetCode】Binary Tree Inorder Traversal
- 【剑指offer】题目1371:最小的K个数
- Matlab中非常实用的快捷键和命令
- C++学习笔记 --- STL倒叙排序reverse函数练习
- WebView适配手机屏幕显示
- 进度条的制作
- Cursor, MergeCursor, MatrixCursor灵活应用
- JS与JSP区别
- MySql导入txt数据
- 每日一练------2/1,3/2,5/3…数列的前20项之和