kth multiple:求第k
個只包含3
、5
或者7
這三個素因子的數。
根據輸入k
,結果肯定小於3 ^ k * 5 ^ k * 7 ^ k
,所以可以把k ^ 3
個數都求出來,然後返回下標為k - 1
的元素。但是這方法顯然不行啊,乘著乘著就溢位了。
另一種方法就是每次將已獲得的最小元素分別乘這三個質數,然後加入到備選集中,每次從備選集中取出最小的加入結果集,備選集可以使用集合或者優先佇列。使用集合不需要手動判重,優先佇列需要手動去重。
class
solution
return vec[k -1]
;}};
使用優先佇列時需要手動判重,而且預設為大根堆,需要傳入greater
轉換為小根堆。
class
solution
}return vec[k -1]
;}};
上面兩種方法要麼是借用資料結構來判重,要麼是手動判重,如果可以省略判重的步驟就好了。通過觀察上面過程可以發現,每當取出乙個新元素時,分別需要乘3
、5
和7
來生成新的元素,在這個過程中會得到重複的元素。通過觀察可以發現,如果乙個元素x
是乘5
得到的,當將這個元素乘3
後,肯定和備選集中的乙個元素是重複的,因為當對這個元素分解質因數時,最後乙個質因數肯定是5
,而y = x * 3 / 5
肯定是小於x
的,這就意味著當將y
加入結果集時,通過乘5
已經將新元素加入了備選集,根據這個性質,只需要將元素x
乘5
和7
的結果加入備選集就可以了。
class
solution
else
if(minele == five.
front()
)else
}return vec[k -1]
;}};
因為整型數的範圍存在上限,也可以把表打出來然後直接返回即可。 程式設計師面試金典
1.有個小孩正在上樓梯,樓梯有n階台階,小孩一次可以上1階 2階 3階。請實現乙個方法,計算小孩有多少種上樓的方式。為了防止溢位,請將結果mod 1000000007 給定乙個正整數intn,請返回乙個數,代表上樓的方式數。保證n小於等於100000。int countways int n retu...
程式設計師面試金典 2 2
return kth to last 返回單鏈表中倒數第k個元素。下面會分別使用遞迴和非遞迴的方法來解決這道題,一般來說遞迴的方法寫起來更容易,但是效率一般不是最好的,比如這道題遞迴解法的 量大約是非遞迴解法的一半,但是時間複雜度依然是o n 遞迴解法。這種方法的本質是先遍歷到鍊錶尾部,最後再返回的...
程式設計師面試金典 2 4
partition 編寫 將鍊錶中小於x的元素放在鍊錶的前半部分,大於x的元素放在鍊錶的後半部分,沒有順序要求。如果是陣列的話,根據x對陣列進行劃分的方法類似於快排。對於鍊錶會更簡單一些,可以直接將原始鍊錶拆分為兩個鍊錶,乙個中所有元素比x小,乙個中所有元素比x大,最後再進行連線。通過在鍊錶中使用b...