关闭

最小的k个数

147人阅读 评论(0) 收藏 举报
分类:

题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8.则最小的4个数字是1、2、 3、 4.

思路:这道题有很多解法,最简单的思路为将n个数排序,然后输出排序后的k个数。还有就是利用堆的特点来解决,但都是排序的一种变体,时间复杂度为O(nlogn).这里我们用另外一种解法-分治法,基于快速排序的partition函数得来,如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边,这样调整之后,位于数组中左边的k个数字就是最小的k个数字。

代码:

#include <iostream>
#include <vector>

using namespace std;

int partition(vector<int> &vec,int beg, int end){
	if(beg < end){
		int key = vec[beg];
		int low = beg, high = end;
		while(low < high){
			while(low < high && key < vec[high])
				--high;
			vec[low] = vec[high];
			while(low < high && key > vec[low])
				++low;
			vec[high] = vec[low];
		}
		vec[low] = key;
		return low;
	}
	return -1;
}

void findmink(vector<int> &vec, int k){
	int beg = 0, end = vec.size()-1, position = partition(vec, beg, end);
	while(position != k-1){
		if(position > k-1){
			end = position - 1;
			position = partition(vec,beg, end);
		}else{
			beg = position+1;
			position = partition(vec, beg, end);
		}
	}
	for(int i=0;i<=position;++i)
		cout << vec[i] << " ";
	cout << endl;
}

int main(){
	int a[] = {4,5,1,6,2,7,3,8};
	vector<int> vec(a,a+8);
	findmink(vec, 4);
	return 0;
}

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[剑指Offer]最小的K个数

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 输入 int[] input:待搜索的数组 int ...
  • shakespeare001
  • shakespeare001
  • 2016-04-29 14:29
  • 2571

寻找数组中最小的k个数(快排和堆排)

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置...
  • liuguangqiang
  • liuguangqiang
  • 2016-08-15 13:02
  • 3967

Top K算法和寻找第K个最小的数

关于Top K算法和寻找第K个最小的数这种经典问题网上已经说的很详细了,不过毕竟不是自己的,这里自己总结一下,而且这两个问题又稍稍有点区别。 1.Top K算法:即寻找一列数中K个最小值或K个最大值,...
  • moses1213
  • moses1213
  • 2016-01-19 19:34
  • 1604

用PriorityQueue解决选择最小的K个数问题

Java 中的PriorityQueue是一个基于优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2016-03-19 15:26
  • 1759

面试题30:最小的k个数(未)

面试题30:最小的k个数题目描述: 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。题目分析: 找出最小的k个数,直观的解...
  • zxc995293774
  • zxc995293774
  • 2015-10-08 20:43
  • 345

找出无序数组中的最小的k个数(利用大根堆)

package com.itheima.paixu; import java.util.Scanner; /** * 找到无序数组中最小的k个数 * @author Dell * */ p...
  • wwe4023
  • wwe4023
  • 2017-07-15 11:08
  • 415

寻找数组中最小的k个数(快排和堆排)

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置...
  • liuguangqiang
  • liuguangqiang
  • 2016-08-15 13:02
  • 3967

寻找最小的k个数(Select方法)

/* *寻找最小的k个数 *题目描述:5.查找最小的k个元素 *题目:输入n个整数,输出其中最小的k个。 *例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。...
  • wuwuwuwuwuwuwuwu
  • wuwuwuwuwuwuwuwu
  • 2012-09-15 10:20
  • 1281

最小的K个数 (冒泡和最小堆)

问题:最小的K个数 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 - 方法一(冒泡排序k趟) 思路:冒泡排...
  • hyqsong
  • hyqsong
  • 2015-10-31 08:54
  • 314

26.最小的K个数:快排应用

最小的K个数 参与人数:3182时间限制:1秒空间限制:32768K 本题知识点: 数组  算法知识视频讲解 题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,...
  • chengonghao
  • chengonghao
  • 2016-05-08 21:14
  • 395
    个人资料
    • 访问:9027次
    • 积分:484
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论