题目要求

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.

用n个硬币搭台阶,要求第k级台阶必须有k个硬币。问n个硬币最多能够搭多少级台阶?
如五个硬币最多能够搭两级台阶,8个硬币最多搭三级台阶。

思路和代码

反过来讲,如果要搭k级台阶,那么k级台阶共包含(k+1) * k / 2个硬币。因此我们只需要找到可以搭建的台阶的边界,并采用二分法将边界不断缩小直到达到最大的台阶数。

    public int arrangeCoins(int n) {
        long rgt = (int) (Math.sqrt(n) * Math.sqrt(2) + 1);
        long lft = 0;
        while(lft <= rgt) {
            long mid = lft + (rgt -lft) / 2;
            long total = (mid + 1) * mid / 2;
            if(total <= n) {
                lft = mid + 1;
            }else {
                rgt = mid - 1;
            }
        }
        return (int)lft-1;
    }

raledong
2.7k 声望2k 粉丝

心怀远方,负重前行