力扣刷題筆記:441.排列硬幣(二分查詢模板題,等差數列求前n項和,程式碼很好理解)
阿新 • • 發佈:2021-02-19
題目:
441、排列硬幣
你總共有 n 枚硬幣,你需要將它們擺成一個階梯形狀,第 k 行就必須正好有 k 枚硬幣。
給定一個數字 n,找出可形成完整階梯行的總行數。
n 是一個非負整數,並且在32位有符號整型的範圍內。
示例 1:
n = 5
硬幣可排列成以下幾行:
¤
¤ ¤
¤ ¤
因為第三行不完整,所以返回2.
示例 2:
n = 8
硬幣可排列成以下幾行:
¤
¤ ¤
¤ ¤ ¤¤ ¤
因為第四行不完整,所以返回3.
題解思路:
將n視為等差數列的前k項和,利用二分法逼近查詢,找到n所處的k和k+1項區間,返回k即為所求。
題解python程式碼:
class Solution:
def arrangeCoins(self, n: int) -> int:
if n==0: return 0
k1, k2 = 1, n
while k1<=k2: # 標準二分查詢寫法
k = (k1+k2)//2
if k+k*(k-1)//2 <= n < k+1+k*(k+1)//2: # 等差數列前k項和
return k
elif n<k+k*(k-1)//2:
k2 = k-1
else:
k1 = k+1
作者:a-qing-ge
連結:https://leetcode-cn.com/problems/arranging-coins/solution/er-fen-cha-zhao-mo-ban-xie-fa-by-a-qing-4y86s/
來源:力扣(LeetCode)https://leetcode-cn.com/problems/arranging-coins/