我的題解:超時
大佬題解1:數學公式:
大佬題解二,三種思路
441. 排列硬幣
你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。
給定乙個數字 n,找出可形成完整階梯行的總行數。
n 是乙個非負整數,並且在32位有符號整型的範圍內。
示例 1:
n = 5
硬幣可排列成以下幾行:
¤¤ ¤
¤ ¤因為第三行不完整,所以返回2.
標籤:二分查詢,數學
class
solution
return i-1;
}}
根據數學公式,k(k+1) /2 = n,可以得到其正數解為:k = sqrt(2n+1/4) - 1/2。然後求整即可。唯一的問題是,這裡2n+1/4有可能會超出sqrt函式的引數範圍。
於是,我們可以變換一下, k = sqrt(2) * sqrt(n+1/8) - 1/2,這樣求平方根就不會超限了。
於是,我們就有了這麼一行**
class
solution
}
/**
* 數學求解法 o(1) 不含求根預算
** @param n
* @return
*/public
static
intarrangecoins
(int n)
/** * 迭代求解法 o(n)//類似我的解法但是好像這些寫不會 沒超時
** @param n
* @return
*/public
static
intarrangecoins2
(int n)
return i -1;
}/**
* 二分查詢,o(log(n / 2 + 1))
** @param n
* @return
*/public
static
intarrangecoins3
(int n)
else
if(mid *
(mid +1)
<=
(long)2
* n)
else
}return
(end *
(end +1)
==(long)2
* n)?(
int) end :
(int
) start;
}
@elenorechang 能講解一下為啥要用long嗎因為判斷條件
mid * (mid + 1)
用 int 會溢位的,當然也可以把變數型別設定為 int,判斷條件中if ((long)mid * (long)(mid + 1) == (long) 2 * n)
441 排列硬幣
你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。給定乙個數字 n,找出可形成完整階梯行的總行數。n 是乙個非負整數,並且在32位有符號整型的範圍內。示例 1 n 5 硬幣可排列成以下幾行 因為第三行不完整,所以返回2.示例 2 n 8 硬幣可排列成以下幾行 因...
441 排列硬幣
題目描述 你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。給定乙個數字 n,找出可形成完整階梯行的總行數。n 是乙個非負整數,並且在32位有符號整型的範圍內。示例 1 n 5 硬幣可排列成以下幾行 因為第三行不完整,所以返回2.示例 2 n 8 硬幣可排列成以...
LeetCode 441 排列硬幣
你總共有 n 枚硬幣,你需要將它們擺成乙個階梯形狀,第 k 行就必須正好有 k 枚硬幣。給定乙個數字 n,找出可形成完整階梯行的總行數。n 是乙個非負整數,並且在32位有符號整型的範圍內。執行用時 36ms 記憶體消耗 14mb 題後反思 這個時候就看出數學的用處了,一句話就可以代替注釋中的全部內容...