这是悦乐书的第229次更新,第241篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第96题(顺位题号是441)。您想要以楼梯形状形成总共n个硬币,其中每个第k行必须具有恰好k个硬币。给定n,找到可以形成的完整楼梯行的总数。n是一个非负整数,适合32位有符号整数的范围。例如:

n = 5

硬币可以形成以下行:

¤

¤¤

¤¤

因为第3行不完整,我们返回2。

n = 8

硬币可以形成以下行:

¤

¤¤

¤¤¤

¤¤

因为第4行不完整,我们返回3。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

因为每一行所表示的硬币需要和行号相等,因此我们可以直接对n从1开始做减法。使用一个变量从1开始做自加,n每次减去该变量,直到n不大于0,最后判断n是否等于0,等于0就返回该变量,否则返回该变量减1。

public int arrangeCoins(int n) {
int i = 0;
while (n > 0) {
i++;
n -= i;
}
return n == 0 ? i : i-1 ;
}

03 第二种解法

利用二分法和等差数列的特性。每行楼梯对应的硬币数,可以构成一个公差为1的等差数列,前n行楼梯总共需要(1+n)*n/2个硬币,我们可以使用二分法,不断取中间值,获取对应的硬币数,然后和n做比较,如果等于,直接返回当前中间数,如果小于,低位变成中间位加1,如果大于,高位变成中间位减1,最后返回高位。

在计算等差数列前n个数之和时,使用long类型,以免溢出。

public int arrangeCoins2(int n) {
int low = 0, high = n;
while (low <= high) {
int mid = low + (high - low)/2;
long sum = (1L+mid)*mid/2;
if (sum == n) {
return mid;
} else if (sum < n) {
low = mid+1;
} else {
high = mid-1;
}
}
return high;
}

04 第三种解法

还是利用等差数列的求和公式x=(1+n)×n/2,可以反向推导求n的值。

2x = (1+n)*n;

n^2 + n - 2x = 0;

此时就变成解一元二次方程的根了,2a分之负b加减根号下b的平方减4乘以a乘以c,因为n大于0,所以只用求正根即可。

n = (-1 + Math.sqrt(1-4×(-2x)))/2;

n = (-1 + Math.sqrt(1+8x))/2;

其中,我们需要注意数据类型的隐式转换,Math.sqrt返回的double类型的数据,因此8最好是double或者long类型的。

public int arrangeCoins3(int n) {
return (int)((-1 + Math.sqrt(1 + 8.0*n)) / 2);
}

05 小结

算法专题目前已连续日更超过两个月,算法题文章96+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Arranging Coins(Java实现)的更多相关文章

  1. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  2. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  3. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  4. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  5. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  6. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  7. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  8. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

  9. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

随机推荐

  1. js引用值传递改变问题(使用深拷贝)

    //当我们定义一个全局变量,然后页面加载时进行一次赋值. //后面对加载的对象进行push后全局变量改变了,这是由于引用类型的问题,此时使用深拷贝进行保存原来的数据 //深拷贝 function de ...

  2. 《C#并发编程经典实例》学习笔记—异步编程关键字 Async和Await

    C# 5.0 推出async和await,最早是.NET Framework 4.5引入,可以在Visual Studio 2012使用.在此之前的异步编程实现难度较高,async使异步编程的实现变得 ...

  3. 第一册:lesson ninety-seven。

    原文: A small blue case. I left a suitcase on the train to London the other day. Can you describe it , ...

  4. sql 新增 修改 删除 列操作

    IF COL_LENGTH('SYS_Department', 'CreatedBy') IS NOT NULL --判断 SYS_Department 中是否存在 CreatedBy 字段 EXEC ...

  5. H5 video播放视频遇到的问题

    我在别的网站上下载了一个mp4格式的视频,加到video标签里可以正常播放, 然后我用FLV自己转成mp4,却提示不支持的格式和mine类型, 后来找到一篇文章 http://jingyan.baid ...

  6. c# 溢出上下文检测

    对于类型转换是否溢出可以用 checked和unchecked运算符 在unchecked上下文中会忽略溢出 在checked 会抛出异常 ; byte sb; sb = unchecked((byt ...

  7. VS2017 启动调试出现 无法启动程序“http://localhost:15613” 操作在当前状态中是非法的。 同时附加进程也是错误的解决方法

    第一次发表这样的博客,不会如何的排版,还有很多的不懂,大神勿喷哈! 同时是给自己做的一次记录,已方便后面可能会同样出现该问题后不用像无头苍蝇一样到处百度乱找 VS2017 启动调试出现  无法启动程序 ...

  8. MyISAM和InnoDB区别详解

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  9. C#设计模式之十外观模式(Facade Pattern)【结构型】

    一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...

  10. SD Consultant Year End Activities

    SD Consultant Year End Activities What are the year ending activities to be done for SAP SD?   S.No ...