数组中的第K个元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
解析
详细解析请看上一条博客,这个算是小顶堆的练习
代码
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int,vector<int>,greater<int>> minheap;
for(auto x : nums){
if(minheap.size()==k){
if(x<minheap.top()) continue;
minheap.pop();
}
minheap.push(x);
}
return minheap.top();
}
};
题目丑数II
编写一个程序,找出第 n 个丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1.1 是丑数。
2.n 不超过1690。
解析
-
新的丑数一定是在旧的丑数中产生的
-
所有的就丑数乘以权重2,3,5 最小的
-
如何确定谁乘以权重,三指针法应运而生
-
三指针idx[0]=0,idx[1]=0,idx[2]=0从头开始遍历丑数数组:
-
刚开始时数组的值为1;
-
12,13,1*5的最小值是2;新的丑数生成,idx[0]后移一位对应丑数数组的元素2;
-
22,13,1*5的最小值是3;新的丑数生成,idx[1]后移一位指向丑数数组2;一次类推
-
-
要使用三个并列的if让指针指向一个更大的数,不能用if-else。因为有这种情况:
-
丑数6,可能由于丑数2乘以权重3产生;也可能由于丑数3乘以权重2产生。
-
丑数10,... 等等。
-
代码
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> ugly(n,1),idx(3,0);
for(int i=1;i<n;i++){
int a = ugly[idx[0]] *2,b= ugly[idx[1]]*3,c= ugly[idx[2]]*5;
int next = min(a,min(b,c));
if(next == a) ++idx[0];
if(next ==b) ++idx[1];
if(next==c) ++idx[2];
ugly[i]=next;
}
return ugly.back();
}
};