leetcode-441:排列硬币

简介: leetcode-441:排列硬币

题目

题目链接

你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。

给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。

示例 1:

输入:n = 5
输出:2
解释:因为第三行不完整,所以返回 2 。

示例 2:

输入:n = 8
输出:3
解释:因为第四行不完整,所以返回 3 。

解题

方法一:暴力解法

从头开始遍历

class Solution {
public:
    int arrangeCoins(int n) {
        int count=0;
        int num=0;
        do{
            num++;
            count+=num;
        }while(count<=n-num-1);//如果下一层不能装满,就break
        return num;
    }
};

方法二:二分查找

这道题是查找目标值的最大左边界。和查找目标值写法有些区别

对于查找边界,并不是查找出一个确定的值while(left循环条件中,不需要加等于号。最终left和right均为目标值的最大左边界,如果加等号会死循环。

由于mid*(mid+1)一定要小于2*n,因此left=mid, 不能使用left=mid+1,否则可能会超过2*n

另外mid=(right+left+1)/2,是使得取整的时候向上取整。防止left=mid死循环(正常情况的二分查找,向下取整,向上取整都是可以。)

注意:本题的n比较大,可能会溢出,用了特别的写法。

class Solution {
public:
    int arrangeCoins(int n) {
        int left=1,right=n;
        while(left<right){
            int mid=(right-left+1)/2+left;
            if((long long)mid*(mid+1)<=(long long)2*n){
                left=mid;
            }
            else{
                right=mid-1;
            }
        }
        return left;
    }
};

最后循环结束,left=right, 并且为靠近target的最大左边界

相关文章
|
23天前
|
机器学习/深度学习 存储 算法
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
52 0
|
8月前
|
算法 测试技术 C++
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
|
1天前
|
Java
贪心 -力扣860.柠檬水找零力扣2208.将数组和减半的最少操作次数力扣179.最大数力扣376.摆动序列
贪心 -力扣860.柠檬水找零力扣2208.将数组和减半的最少操作次数力扣179.最大数力扣376.摆动序列
|
23天前
|
算法
贪心算法:排列算式
贪心算法:排列算式
8 0
|
23天前
|
C++
排列硬币(C++)
排列硬币(C++)
25 0
|
10月前
|
算法
LeetCode 算法 | 如何排列硬币?
LeetCode 算法 | 如何排列硬币?
每日一题——乘积小于 K 的子数组
每日一题——乘积小于 K 的子数组
52 0
每日一题——乘积小于 K 的子数组
LeetCode 1561. 你可以获得的最大硬币数目
有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币:
78 0
排列硬币
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数
49 0

热门文章

最新文章