給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, …)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。
任何正整數都可以拆分成不超過4個數的平方和 —> 答案只可能是1,2,3,4
若乙個數最少可以拆成4個數的平方和,則這個數還滿足 n = (4^a)*(8b+7) —> 因此可以先看這個數是否滿足上述公式,如果不滿足,答案就是1,2,3了
若這個數本來就是某個數的平方,那麼答案就是1,否則答案就只剩2,3了
如果答案是2,即n=a2+b2,那麼我們可以列舉a,來驗證,如果驗證通過則答案是2,否則只能是3
因此降維打擊的**可寫成這樣
// n=4^a(8b+7) 四平方定理
func
numsquares
(n int
)int
if n %8==
7 a:=
0for a*a <= n
else
} a +=1}
return
3}
計算遞迴層深度,上下層深度比較,最小為最佳,以減次大平方數為條件,餘數作次級
import
"math"
func
numsquares
(n int
)int
// 內層裁剪,減少來自回溯期的無效計算
if step >= minstep-
1// 倒序確保計算量最少
sqrt :=
int(math.
sqrt
(float64
(remain)))
for i:=sqrt;i>=
1;i--
}dfs(0
,n)return minstep
}
微積分的思維 降維打擊
寫在前面 眾所周知,在我們的意識體系裡,比較兩個變數的前提是 單位相同,把兩個單位不同的量作比較是沒有意義的一件事情,比如乙個人體重100kg,另乙個人身高180cm,我們是沒法用這兩個數量作比較的。但是在微積分的思維裡,經過適當的轉化,這種跨單位的量的比較,將會變得有意義。在工程設計中,普遍地會用...
狀態壓縮技巧 動態規劃的降維打擊
本文由labuladong原創,本博文僅作為知識點學習,不會用於任何商業用途!動態規劃技巧對於演算法效率的提公升非常可觀,一般來說都能把指數級和階乘級時間複雜度的演算法優化成 o n 2 堪稱演算法界的二向箔,把各路魑魅魍魎統統打成二次元。但是,動態規劃本身也是可以進行階段性優化的,比如說我們常聽說...
賺錢套路分享 降維打擊,報團取暖的玩法
loonggg 讀完需要 3分鐘 速讀僅需1分鐘 說了,接下來的一段時間,我會陸陸續續分享一些,我所知道的關於很多程式設計師賺錢套路的 所見所聞 今天,我過來給大家講故事了。這個故事的主人也是乙個程式設計師。應該是四五年前的事,看到這個人的玩法的時候,感覺挺有意思,當時那個人搞得名字還挺響亮,叫 降...