这是悦乐书的第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. Perl:undef类型和defined()函数

    undef和defined()函数 undef表示的像是数据库中的"null".它表示空,啥也没有,是完全未定义的.这不等于字符串的空,不等于数值0,它是另一种类型. 在某些时候, ...

  2. [转]What is Blue Prism?

    本文转自:https://www.guru99.com/blue-prism-tutorial.html#5 What is Blue Prism? Blue Prism is a UK-based ...

  3. Python网络编程之Socket的简单实现

    一.引入 关于Python的网络编程,最基础莫过于socket了. socket,又称“套接字”,网络上的两个程序如果想要实现双向的数据通信,需要建立连接,这个连接的一端就称为一个socket. py ...

  4. .Net Core 项目中添加统一的XSS攻击防御过滤器

    一.前言 最近公司内部在对系统的安全进行培训,刚好目前手里的一个.net core 项目中需要增加预防xss的攻击,本文将大概介绍下何为XSS攻击以及在项目中如何统一的预防XSS攻击. 二.XSS简介 ...

  5. 4.1 explain 之 id

    一.id 是什么 select 查询的序列化,包含一组数字,表示查询中执行select子句或操作的顺序 二.三种情况 a. id相同,执行顺序由上至下 b. 如果是子查询,id的序号会递增,id值越大 ...

  6. Netty实战十四之案例研究(一)

    1.Droplr——构建移动服务 Bruno de Carvalho,首席架构师 在Droplr,我们在我的基础设施的核心部分.从我们的API服务器到辅助服务的各个部分都使用了Netty. 这是一个关 ...

  7. oracle中rownum的使用

    rownum是系统的一个关键字,表示行号,是系统自动分配的,第一条符合要求的数据行号就是1,第二条符合要求的数据行号就是2. Rownum 不能直接使用 例:取前多少条数据: 取中间的一些数据: se ...

  8. Hibernate入门(一)

    1.导包 导入Hibernate最基本的包(不要忘记导入数据库驱动包了!) 下载文件名为黄色框框中的名称的压缩包在对应路径下,有个required包下的所有包就是必备的基本包 2.建表 USE TES ...

  9. Itween 动画插件中 的画线

    1.首先在你的层次视图中创建所需的节点 ,节点的位置顺序排列 2.导入Itween 插件 1.可以直接从项目外部拖拽到本项目中 2.通过AssetStore 中导入 3.在你的父节点上创建脚本 ,对象 ...

  10. 记录使用Redis和nginx 实现一个简单的负载均衡(FB)

    这两年在博客园看了不少大牛的分享,一直打算能写点什么东西. 之前偶然看见一个利用Redis 当作 Session数据宿主的demo,出处我已经找不到了.后来没事看了看nginx相关的东西.其中负载均衡 ...