力扣:丑数II和数组中前K大的元素

数组中的第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。

解析

  1. 新的丑数一定是在旧的丑数中产生的

  2. 所有的就丑数乘以权重2,3,5 最小的

  3. 如何确定谁乘以权重,三指针法应运而生

  4. 三指针idx[0]=0,idx[1]=0,idx[2]=0从头开始遍历丑数数组:

    1. 刚开始时数组的值为1;

    2. 12,13,1*5的最小值是2;新的丑数生成,idx[0]后移一位对应丑数数组的元素2;

    3. 22,13,1*5的最小值是3;新的丑数生成,idx[1]后移一位指向丑数数组2;一次类推

  5. 要使用三个并列的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();
    }
};
posted @ 2019-04-18 18:55  差生_G  阅读(280)  评论(0编辑  收藏  举报