雖然這題挺難寫的,但是仍然提醒了我:解題要注意方法。在明確分析當一條道路走不通的時候,就不要再猶豫了,就要果斷的換方法,嘗試用其它方法解決。否則一味的消耗時間,得不償失。換方法的前提是明確的分析(一定要落到紙上,為什么得不出結果?是復雜度太高?還是難以實現?)后得出的結論是不可行。
1. 題目
2. 分析
這道題挺不好想的。 我一直以為要從數學、數論的角度來解題,但是哪知道最后正確的方法是使用動態規劃。 下面先給出我分析的過程:
【算術基本定理】:任何一個大于1的整數都能唯一分解為有限個質數的乘積。
根據這個定理,我們可以把這些正整數劃分到各個質數“管轄”的范圍內。最后比拼一下哪個質數管的數多,我們就輸出這個集合就行。這么看,貌似可行,但實際思路上存在漏洞:對于能夠整除同一個質數的數二者之見并不能整除,比如[4,6]
這一對,也就是說這個方法在本質上并不可行,(但我卻硬生生的想了20min… 真sb)。同時,即使可行,在求解上也存在困難:本題給出的數的范圍是 1 <= nums[i] <= 2 * 10^9
。先要把質數找出來,然后挨個判斷,這個復雜度有點兒高。
正確的方法是:
- 先排序
- 接著判斷下標i結尾的數是否是下標j結尾數的整數倍,如果是,則
dp[i]=dp[j]+1
- 找出dp數組中最大的那個數,然后倒推得到最后的滿足解。
3. 代碼
代碼待更新。