《剑指offer》面试题40. 最小的k个数
问题描述
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
代码
直接进行排序,时间复杂度\(O(N\log(N))\)
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
sort(arr.begin(),arr.end());
return vector<int> (arr.begin(),arr.begin()+k);
}
};
结果
执行用时 :84 ms, 在所有 C++ 提交中击败了20.79%的用户
内存消耗 :19.1 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
用一个数组保存到目前为止最小的\(k\)个元素,时间复杂度\(O(kN)\)
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> ans(arr.begin(),arr.begin()+k);
int i,j,n = arr.size();
for(i = k; i < n; ++i)
{
int tmp = arr[i];
for(j = 0; j < k; ++j)
{
if(ans[j] > tmp)
{
swap(ans[j],tmp);
}
}
}
return ans;
}
};
结果:
执行用时 :1004 ms, 在所有 C++ 提交中击败了5.00%的用户
内存消耗 :18.9 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
nth_element(arr.begin(), arr.begin()+k, arr.end());
return vector<int>(arr.begin(), arr.begin()+k);
}
};
结果:
执行用时 :48 ms, 在所有 C++ 提交中击败了56.42%的用户
内存消耗 :19.1 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> ans;
if(k == 0)return ans;
priority_queue<int> q;
int i = 0, n = arr.size();
while(i < k)
q.push(arr[i++]);
while(i < n)
{
if(arr[i] < q.top())
{
q.pop();
q.push(arr[i]);
}
++i;
}
for(i = 0; i < k; ++i)
{
ans.push_back(q.top());
q.pop();
}
return ans;
}
};
结果:
执行用时 :112 ms, 在所有 C++ 提交中击败了14.01%的用户
内存消耗 :20 MB, 在所有 C++ 提交中击败了100.00%的用户
《剑指offer》面试题40. 最小的k个数的更多相关文章
- 剑指offer 面试题40. 最小的k个数
O(N)划分法,注意这个方法会改变原数据(函数参数是引用的情况下)!当然也可以再定义一个新容器对其划分 要求前k小的数,只要执行快排划分,每次划分都会把数据分成大小两拨.直到某一次划分的中心点正好在k ...
- 剑指Offer:面试题30——最小的k个数(java实现)
问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void Quic ...
- 剑指Offer - 九度1371 - 最小的K个数
剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...
- 剑指offer(29)最小的K个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目分析 这题有两种方法来做. 第一种就是基于partition的 ...
- 【剑指Offer】29、最小的K个数
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 解题思路: 本题最直观的解法就是将输入的n个整数排 ...
- leetcode 签到 面试题40. 最小的k个数
题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k = ...
- 【剑指Offer面试题】 九度OJ1371:最小的K个数
题目链接地址: http://ac.jobdu.com/problem.php?pid=1371 题目1371:最小的K个数 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5938解决:1265 ...
- 剑指 Offer 40. 最小的k个数 + 优先队列 + 堆 + 快速排序
剑指 Offer 40. 最小的k个数 Offer_40 题目描述 解法一:排序后取前k个数 /** * 题目描述:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7. ...
- 剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:ar ...
随机推荐
- 删除空行(嵌套)(Power Query 之 M 语言)
数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...
- CF19A World Football Cup 题解
Content 有 \(n\) 个球队参加一场足球比赛,比赛排名前 \(\dfrac{n}{2}\) 的队伍将会进入下一轮的淘汰赛.比赛将会打 \(\dfrac{n(n-1)}{2}\) 场,胜者得 ...
- CF23A You're Given a String... 题解
Content 给定一个长度为 \(n\) 的字符串,求出至少出现两次的最长子串的长度. 数据范围:\(1\leqslant n\leqslant 100\). Solution 我们直接暴力求出每个 ...
- 深度解析HashMap
讲讲HashMap? 源码解析 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { //辅助 ...
- JAVA通过实体类生成数据库查询语句(驼峰命名规则)
import java.io.IOException; import java.lang.reflect.Field; import java.util.HashMap; import java.ut ...
- VS2015常用的字体 和 插件
Inconsolata 字体 自己常使用 Inconsolata 作为代码字体, 阅读代码非常舒适. 其他插件 GoToDef.vsix , 查看 声明非常方便. (ctrl+鼠标左键) Viasfo ...
- 【LeetCode】666. Path Sum IV 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...
- 【LeetCode】921. Minimum Add to Make Parentheses Valid 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址: https://leetcode. ...
- 【LeetCode】726. Number of Atoms 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/number-o ...
- Revolving Digits(hdu4333)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...