您的位置:首页 > 其它

Ugly Number II

2016-01-21 10:43 218 查看
注意负数,所以要使用long,而不能用int

详细解释 请参见http://www.cnblogs.com/julie-yang/p/5147460.html

#include<vector>
#include<queue>
#include<map>
#include<limits>
#include<iostream>
using namespace std;
struct Node{
long idx;
long val;
};
struct cmp
{    bool operator()(const Node &a,const Node &b)
{
return a.val>b.val;
}
};
class Solution {
public:
int nthUglyNumber(int n) {
priority_queue<Node, vector<Node>, cmp> min_heap;
vector<int> primes;
primes.push_back(2);
primes.push_back(3);
primes.push_back(5);
if (primes.size() == 0) return 0;
map<long, int> start_idx;
start_idx[1] = 0;
int res = 1;

Node temp_node;
temp_node.idx = 1;     //idx  is the first val of start_idx
temp_node.val = primes[0];
min_heap.push(temp_node);

int cnt = 1;
if (n == 1) return 1;
long min_val = INT_MAX;

long min_idx = 0;
while (cnt < n)
{
min_val = min_heap.top().val;
min_idx = min_heap.top().idx;
min_heap.pop();
if ((res != (min_val)))
{
res = min_val;
cnt++;
start_idx[min_val] = 0;
temp_node.idx = min_val;     //idx  is the first val of start_idx
temp_node.val = min_val * primes[0];
min_heap.push(temp_node);

}
if (start_idx[min_idx] < primes.size() - 1)
{
start_idx[min_idx] ++;
temp_node.idx = min_idx;     //idx  is the first val of start_idx
temp_node.val = min_idx * primes[start_idx[min_idx]];
min_heap.push(temp_node);

}

}
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: