前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员面试金典 - 面试题 17.14. 最小K个数(快排划分O(n))

程序员面试金典 - 面试题 17.14. 最小K个数(快排划分O(n))

作者头像
Michael阿明
发布2020-07-13 17:21:11
2910
发布2020-07-13 17:21:11
举报

1. 题目

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

代码语言:javascript
复制
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

提示:
0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/smallest-k-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 排序

代码语言:javascript
复制
class Solution {
public:
    vector<int> smallestK(vector<int>& arr, int k) {
    	sort(arr.begin(),arr.end());
        return vector<int>(arr.begin(),arr.begin()+k);
    }
};

2.2 优先队列(堆)

代码语言:javascript
复制
class Solution {
public:
    vector<int> smallestK(vector<int>& arr, int k) {
    	priority_queue<int,vector<int>,greater<int>> q;//小顶堆
    	for(auto& a : arr)
    		q.push(a);
    	arr.clear();
    	while(k--)
    	{
    		arr.push_back(q.top());
    		q.pop();
    	}
    	return arr;
    }
};
在这里插入图片描述
在这里插入图片描述

2.3 快排划分

参考此篇文章:LeetCode 215. 数组中的第K个最大元素(快速排序)

代码语言:javascript
复制
class Solution {
public:
    vector<int> smallestK(vector<int>& arr, int k) {
        if(arr.empty()||(k==0))
            return {};
    	findkth(arr,k,0,arr.size()-1);
    	return vector<int> (arr.begin(), arr.begin()+k);
    }

    int findkth(vector<int>& arr, int& k, int l, int r)
    {
    	selectMid(arr,l,r);
    	int p = arr[l];
    	int i = l, j = r;
    	while(i < j)
    	{
    		while(i < j && arr[j] > p)
    			j--;
    		swap(arr[i],arr[j]);
    		while(i < j && arr[i] <= p)
    			i++;
    		swap(arr[i],arr[j]);
    	}
    	if(i == k)
    		return i;
    	else if(i < k)
    		return findkth(arr,k,i+1,r);
    	return findkth(arr,k,l,i-1);
    }

    void selectMid(vector<int>& arr, int& l, int& r)
    {
    	int mid = l+((r-l)>>1);
    	if(arr[mid] > arr[r])
    		swap(arr[mid],arr[r]);
    	if(arr[l] > arr[r])
    		swap(arr[mid],arr[r]);
    	if(arr[mid] > arr[l])
    		swap(arr[mid],arr[l]);
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
    • 2.1 排序
      • 2.2 优先队列(堆)
        • 2.3 快排划分
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档