丑数

利用最小堆思想。首先把1压入堆,然后取出堆顶元素,分别乘以2,3,5后把新增的数压入堆。然后再取堆顶元素操作。取第1000个丑数就是取第1000个不同的堆顶元素。

其实如果用set容器来做的话效率可能会提升,因为set不会把重复元素放进自身。set找最小的元素需要O(logN)的时间,表面上比堆的O(1)时间要多,但堆虽然在O(1)时间可以找到最小元素,但取出最小后,调整堆也是要O(logN)的时间。

 1 class Solution {
 2 public:
 3     int GetUglyNumber_Solution(int index) {
 4         priority_queue<long long,vector<long long>,greater<long long> > iq;
 5         iq.push(1);
 6         long long tmp=0;
 7         long long vmin;
 8         for(int i=1;i<=index;i++)
 9         {
10             while(iq.top()==tmp)
11                 iq.pop();
12             vmin=iq.top();
13             iq.pop();
14             tmp=vmin;
15             iq.push(tmp*2);
16             iq.push(tmp*3);
17             iq.push(tmp*5);
18         }
19         return tmp;
20     }
21 };
View Code

 

posted @ 2016-03-29 23:02  vaevaevae  阅读(186)  评论(0编辑  收藏  举报