栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-10 LeetCode441-排列硬币(每日一题)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-10 LeetCode441-排列硬币(每日一题)

题目所给阶梯状的排列方式为等差数列,我们可以很轻易的计算出不同的阶梯行数排满对应的硬币总数,我最开始的想法就是让K自增,同时比较当前K对应的硬币总数与题给N的大小,可以很轻松找出结果。

但是显然时间效率很低,上代码!

class Solution
{
public:
    int arrangeCoins(int n)
    {
        long long sum = 1, k = 1; //long long防止数据溢出
        if (n == 0)
            return 0;
        while (sum < n)
        //累加K,每次计算等差数列的和与n比较
        {
            k++;
            sum = k * (1 + k) / 2;
        }
        //对于最后一行是否占满进行判别
        if (sum == n)
            return k;
        else
            return k - 1;
    }
};

考虑如何在时间反面进行优化,正如方法一所说K自增实际上就相当于一个数组按照索引的遍历,我们在查找一个符合条件的值,这样我们就可以在查找阶段进行优化。我们使用二分查找法代替顺序查找

代码如下

class Solution
{
public:
    int arrangeCoins(int n)
    {
        //还是要注意数据类型的定义,防止溢出
        long long left = 1, right = n, mid;
        while (left < right)
        {
            mid = (left + right) / 2 + 1;
            //观察到我们要找的数字是向下取整,所以中间值我们设定为向上取整,避免特殊情况死循环
            if ((long long)mid * (1 + mid) / 2 > n)
            {
                right = mid - 1;
            }
            else if ((long long)mid * (1 + mid) / 2 < n)
            {
                left = mid;
            }
            else
                return mid;
        }
        return left;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/310058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号