You have a total of n coins that you want to form in a staircase shape, where every k-th row must have exactly k coins.
Given n, find the total number of full staircase rows that can be formed.
n is a non-negative integer and fits within the range of a 32-bit signed integer.
Example 1:
n = 5 The coins can form the following rows: ¤ ¤ ¤ ¤ ¤ Because the 3rd row is incomplete, we return 2.
Example 2:
n = 8 The coins can form the following rows: ¤ ¤ ¤ ¤ ¤ ¤ ¤ ¤ Because the 4th row is incomplete, we return 3.
Subscribe to see which companies asked this question.
解法1:直接计算:
# -*- coding:utf-8 -*-
# leetcode solutions
# 441. Arranging Coins
# coding by Dennis Lu
# 2017/02/11
class Solution(object):
def arrangeCoins(self, n):
"""
:type n: int
:rtype: int
"""
count = 0
row_point = 2
total = 1
while(total <= n):
total += row_point
row_point += 1
count += 1
return count
解法2:二分法搜索:
# -*- coding:utf-8 -*-
# leetcode solutions
# 441. Arranging Coins
# coding by Dennis Lu
# 2017/02/11
class Solution(object):
def arrangeCoins(self, n):
"""
:type n: int
:rtype: int
"""
first = 1
last = n
mid = int((n + 1) / 2)
while(1):
num0 = (1 + mid) * mid * 0.5
num1 = (1 + mid + 1) * (mid + 1) * 0.5
if((num0 <= n) and (num1 > n)):
return mid
if(num0 > n):
last = mid - 1
mid = int((first + last) / 2)
continue
if(num1 <= n):
first = mid + 1
mid = int((first + last) / 2)
解法3:解不等式:
# -*- coding:utf-8 -*-
# leetcode solutions
# 441. Arranging Coins
# coding by Dennis Lu
# 2017/02/11
import math
class Solution(object):
def arrangeCoins(self, n):
"""
:type n: int
:rtype: int
"""
return int(math.sqrt(2 * n + 0.25) - 0.5)
3的算法时间复杂度O(1)