丑数
利用最小堆思想。首先把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 };