1. 程式人生 > >劍指offer——(16)醜數

劍指offer——(16)醜數

沒做出來嗚嗚嗚!乍一看覺得很簡單,結果真正理解題目的意思後就手足無措了,大都時候看完題解都要感嘆一下當初我怎麼沒有想象到這種演算法呢哎,不過也有的時候再堅持一下下就解出來了,前者是學習的過程,後者才是真的進步!

public int GetUglyNumber_Solution(int index) {
        if(index<=4) return index;
		int array[] = new int[index];
	/*	switch (index) {
			case 1:
				return 1;
			case 2:
				return 2;
			case 3:
				return 3;
			case 4:
				return 4;
			case 5:
				return 5;
		}*/
		array[0] = 1;
		array[1] = 2;
		array[2] = 3;
		array[3] = 4;    
		//通過迴圈將醜數依次存入陣列,返回陣列最後一個數
		for (int i = 4; i < index; i++) {
			int min = 0;
			int min2 = 0, min3 = 0, min5 = 0;
			int temp = 0;
			//陣列中的醜數必然是遞增的,陣列中的醜數*2、*3或者*5後得到的必定也是醜數
			for (int j = 0; j < i; j++) {
				// *2 找到比當前陣列中最後一個醜數(陣列中最大的數)大的數就跳出迴圈 用min2儲存
				temp = array[j] * 2;
				if (temp > array[i - 1]) {
					min2 = temp;
					break;
				}
			}
			for (int j = 0; j < i; j++) {
				// *3 
				temp = array[j] * 3;
				if (temp > array[i - 1]) {
					min3 = temp;
					break;
				}
			}
			for (int j = 0; j < i; j++) {
				// *5
				temp = array[j] * 5;
				if (temp > array[i - 1]) {
					min5 = temp;
					break;
				}
			}
			// 比較得出最小的醜數新增到醜數陣列 這樣得到的陣列必然依舊是升序的
			min = min2 > min3 ? (min3 > min5 ? min5 : min3) : (min2 > min5 ? min5 : min2);
			array[i] = min;
		}
		return array[index - 1];	
    }