这是悦乐书的第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. C#静态成员静态类。

    1. 在静态类中,所包含的所有成员必须是静态的.但不是所有静态成员都必须写在静态类中.       实例成员属于具体的对象,静态成员是属于类的.所以访问静态成员的时候不能通过对象来访问,只能通过类名直 ...

  2. Dapper批量更新

    本次示例项目使用Dappe1.50.5和Dapper.Contrib1.50.5 数据库执行的脚本检测工具是SQL Server Prifiler 1.使用Where In 实现批量更新 1.1代码如 ...

  3. Host '127.0.0.1' is not allowed to connect to this MySQL server

    错误:Host  '127.0.0.1'  is  not  allowed  to  connect  to  this  MySQL  server 一般原因: MySQL数据库的配置文件my.i ...

  4. vue+elementUI项目,父组件向子组件传值,子组件向父组件传值,父子组件互相传值。

    vue+elementUI项目,父组件向子组件传值,子组件向父组件传值,父子组件互相传值. vue 父组件与子组件相互通信 一.父组件给子组件传值 props 实现父组件向子组件传值. 1父组件里: ...

  5. html 三列布局(两列自适应,一列固定宽度)

    不做过多解释:主要是记录一个完整的布局样式,实现页面大致三列其中左右两列是自适应宽度,中间固定宽度效果. 不多少代码奉上: CSS样式代码: /******************** *公共标签样式 ...

  6. K8S 部署 ingress-nginx (二) 部署后端为 tomcat

    在上面已经部署了 ingress-nginx, https://www.cnblogs.com/klvchen/p/9903480.html 创建 service 和 pods cd vi tomca ...

  7. 信息检索中的TF/IDF概念与算法的解释

    https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...

  8. loadrunner 脚本优化-参数化之Parameter List参数取值

    脚本优化-参数化之Parameter List参数取值 by:授客 QQ:1033553122 参数取值选项 Select next row Update value on 以上两个选项是改变参数化取 ...

  9. 关于前端js面向对象编程以及封装组件的思想

    demo-richbase 用来演示怎么使用richbase来制作组件的例子 作为一名前端工程师,写组件的能力至关重要.虽然javascript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力 ...

  10. Windows Zip/CentOS/Radhat系统安装Mysql5.7.x方法

    CentOS/Redhat 安装: wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm rpm -Uvh ...