LeetCode---Ugly Number II

題目大意:給出一個數n,求出第n個醜數。所謂醜數是指只能被2,3,5整除的數。1是第一個醜數。

算法思想:

1.利用一個數組存儲現有的醜數使其有序排列。

2.然後將數組中的每一個數分別乘以2,3,5得到一批新的醜數,將其已經存在數組中的醜數排除。找出最小的那個數即是數組中的下一個數。

3.爲了簡化步驟2,可知數組存在一個數使得在它前面的數乘以2小於等於當前最大的醜數,使得它後面的數乘以2都大於當前最大的醜數,記錄這個數爲T2,同理可得T3和T5.

4.數組中下一個醜數即爲min(T2*2,T3*3,T5*5).

代碼如下:

class Solution {
public:
    int nthUglyNumber(int n) {
        if (n<=0) return 0;
    	int* uglyNumbers= new int[n];
    	int* mulity2 = uglyNumbers;
    	int* mulity3 = uglyNumbers;
    	int* mulity5 = uglyNumbers;
    	uglyNumbers[0] = 1;
    	int nextIndex = 1;
    	while (nextIndex<n){
    		uglyNumbers[nextIndex] = minNum(*mulity2*2,*mulity3*3,*mulity5*5);
    		while (*mulity2 * 2 <= uglyNumbers[nextIndex]){
    			++mulity2;
    		}
    		while (*mulity3 * 3 <= uglyNumbers[nextIndex]){
    			++mulity3;
    		}
    		while (*mulity5 * 5 <= uglyNumbers[nextIndex]){
    			++mulity5;
    		}
    	
    		++nextIndex;
    	}
    	int ugly = uglyNumbers[nextIndex-1];
    	delete[] uglyNumbers;
    	return ugly;
    }
    int minNum(int a,int b,int c){
	   int temp = a < b ? a : b;
   	   return temp < c ? temp : c;
    }
};


發佈了193 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章