0 前言
简单排序:直接插入、直接选择、冒泡 O(n2)
优化排序:希尔排序、堆排序、快速排序 O(N log N)
归并排序。
要能够从时间复杂度、空间复杂度比较优缺点。
- 39 数组中出现次数超过一半的数字
- 40 最小的k个数
- 41 数据流中的中位数
39 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
法一:哈希表
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty())
return NULL;
int len=numbers.size();
map<int,int> mp;//哈希表
for(int i=0;i<len;i++){
mp[numbers[i]]++;
}
for(int i=0;i<len;i++){
if(mp[numbers[i]]>len/2)
return numbers[i];
}
return 0;
}
};
40 最小的k个数
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
法一:使用STL的sort O(NlogN)
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(input.empty()||k>input.size())
return res;
sort(input.begin(),input.end());//使用sort
for(int i=0;i<k;i++){
res.push_back(input[i]);
}
return res;
}
};
法二:快排主划分函数partition O(n)
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(input.empty()||k>