美文网首页
LeetCode-441-排列硬币

LeetCode-441-排列硬币

作者: 醉舞经阁半卷书 | 来源:发表于2022-04-24 21:25 被阅读0次

排列硬币

题目描述:你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。

给定一个数字 n,找出可形成完整阶梯行的总行数。

n 是一个非负整数,并且在32位有符号整型的范围内。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/arranging-coins/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:穷举法

简单的累加,直到大于n为止,最后返回相应的层数。这种方法效率太低,n很大时会超时。

解法二:二分查找法

首先,上下限low和high分别是最大和最小的层数,最大值根据 n = x * (x + 1) / 2 估算得到,然后利用二分查找法找到最多可以放到第几层,最后返回层数即可。

public class LeetCode_441 {
    /**
     * 穷举法,n超大时会超时,效率不高
     *
     * @param n
     * @return
     */
    public static int arrangeCoins(int n) {
        int sum = 0, rows = 0;
        for (int i = 1; ; i++) {
            if (sum + i > n) {
                break;
            }
            sum += i;
            rows++;
        }
        return rows;
    }

    /**
     * 二分查找法
     *
     * @param n
     * @return
     */
    public static int arrangeCoins2(int n) {
        // low和high分别是最大和最小的层数,最大值根据 `n = x * (x + 1) / 2` 估算得到
        int low = 1, high = (int) Math.sqrt(Double.valueOf(Integer.MAX_VALUE) * 2), mid = -1;
        // 利用二分查找法找到最多可以放到第几层
        while (low <= high) {
            mid = (low + high) / 2;
            double temp = (double) mid * (mid + 1) / 2;
            if (temp > n) {
                high = mid - 1;
            } else if (temp < n) {
                low = mid + 1;
            } else {
                return mid;
            }
        }
        double temp = (double) mid * (mid + 1) / 2;
        if (temp > n) {
            return mid - 1;
        } else {
            return mid;
        }
    }

    public static void main(String[] args) {
        // 测试用例一,期望输出: 2
        System.out.println(arrangeCoins2(5));
        // 测试用例二,期望输出: 3
        System.out.println(arrangeCoins2(8));
        // 测试用例三,期望输出:65535
        System.out.println(arrangeCoins2(2147483647));
        // 测试用例三,期望输出:60070
        System.out.println(arrangeCoins2(1804289383));
    }
}

【每日寄语】 凡事若等明天做,机遇便从眼前过。

相关文章

  • LeetCode-441-排列硬币

    排列硬币 题目描述:你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一...

  • 排列硬币

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/arrang...

  • 【LeetCode通关全记录】441. 排列硬币

    【LeetCode通关全记录】441. 排列硬币 题目地址:441. 排列硬币[https://leetcode-...

  • 如何排列硬币?

    题目 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一个数字 n,找...

  • 441-排列硬币

    排列硬币 题目 你总共有n枚硬币,你需要将它们摆成一个阶梯形状,第k行就必须正好有k枚硬币。 给定一个数字n,找出...

  • 441. 排列硬币

    你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。 给定一个数字 n,找出可...

  • 441-排列硬币

    你总共有n枚硬币,你需要将它们摆成一个阶梯形状,第k行就必须正好有k枚硬币。给定一个数字n,找出可形成完整阶梯行的...

  • 441. 排列硬币

  • 【LeetCode】441. 排列硬币

    题目描述 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。 给定一个数字 ...

  • leetcode 441. 排列硬币

    你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。 给定一个数字 n,找出可...

网友评论

      本文标题:LeetCode-441-排列硬币

      本文链接:https://www.haomeiwen.com/subject/yzxxyrtx.html