劍指offer 演算法 (時間空間效率的平衡)

2021-07-04 20:25:06 字數 1356 閱讀 2361

題目描述

把只包含因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

解析:根據醜數的定義,醜數應該是另乙個醜數乘以2、3或者5的結果(1除外)。因此我們可以建立乙個陣列,裡面的數字是排好序的醜數。裡面的每乙個醜數是前面的醜數乘以2、3或者5得到的。那關鍵就是確保陣列裡的醜數是有序的了。我們假設陣列中已經有若干個醜數,排好序後存在陣列中。我們把現有的最大醜數記做m。現在我們來生成下乙個醜數,該醜數肯定是前面某乙個醜數乘以2、3或者5的結果。我們首先考慮把已有的每個醜數乘以2。在乘以2的時候,能得到若干個結果小於或等於m的。由於我們是按照順序生成的,小於或者等於m肯定已經在陣列中了,我們不需再次考慮;我們還會得到若干個大於m的結果,但我們只需要第乙個大於m的結果,因為我們希望醜數是按從小到大順序生成的,其他更大的結果我們以後再說。我們把得到的第乙個乘以2後大於m的結果,記為m2。同樣我們把已有的每乙個醜數乘以3和5,能得到第乙個大於m的結果m3和m5。那麼下乙個醜數應該是m2、m3和m5三個數的最小者

class solution ;

int cur=0;

while(str[cur] != '\0')

cur=0;

while(str[cur] != '\0')

//delete cnt;

return -1;

}};

題目描述

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。

解析:用乙個輔助陣列儲存比0~8大的數的數量。遍歷每個數時累加既得結果

class solution 

}return cnt;

}};

題目描述

輸入兩個鍊錶,找出它們的第乙個公共結點。

解析:由於兩個鍊錶有公共結點,兩條鏈必從公共結點開始合併為一鏈。即從鏈尾開始的話兩鍊錶重合到公共結點。即去除兩鍊錶長度差開始遍歷的話,當兩節點相等,即為公共結點。

/*

struct listnode

};*/

class solution

return length;

}listnode* findfirstcommonnode( listnode *phead1, listnode *phead2)

while(shortlist!=null)

return null;

}};

劍指offer 優化時間與空間效率

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。coding utf 8 class solution def getuglynumber solution self,ind...

劍指offer 之 時間空間效率的平衡

題目描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。維護三個佇列,選擇三個佇列頭最小的數加入醜數陣列,同時將該最小的數乘以2,3,5放入三個佇列 public in...

劍指offer 之 時間效率

30.最小的k個數 31.連續子陣列的最大和 32.從1到n整數中1出現的次數 33.把陣列排成最小的數 題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。維護乙個計數器...