LeetCode算法题-Arranging Coins(Java实现)
这是悦乐书的第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实现)的更多相关文章
- LeetCode算法题-Heaters(Java实现)
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
- LeetCode算法题-Sqrt(Java实现)
这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
随机推荐
- backbond整体架构
(function(factory) { // 在这里是backbone模块化的一个接口.支持AMD,CMD和全局变量模式.代码很好理解. })(function(root, factory, _, ...
- 了解golang的可变参数(... parameters),这一篇就够了
在实际开发中,总有一些函数的参数个数是在编码过程中无法确定的,比如我们最常用的fmt.Printf和fmt.Println: fmt.Printf("一共有%v行%v列\n", r ...
- iframe实用操作
iframe高度设置为子页面高度 //需要使用Jquery $(document).ready(function () { parent.document.getEleme ...
- mongodb与java整合
mongodb与java整合需要用到mongodb驱动,如果是maven环境,则添加如下倚赖: <dependency> <groupId>org.mongodb</gr ...
- Nginx之OCSP stapling配置
摘要: 正确地配置OCSP stapling, 可以提高HTTPS性能. 什么是OCSP stapling? OCSP的全称是Online Certificate Status Protocol,即在 ...
- javascript模块化编程-立即执行函数(IIFE)
IIFE 全拼Imdiately Invoked Function Expression,立即执行的函数表达式. 语法 var module1 = (function(){ var _count = ...
- 广州.net俱乐部12月份ABP框架活动场地征集、志愿者征集、合作讲师\副讲师征集
大家好,我在<被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾>一文中提到,我将在12月份搞一场ABP框架活动,现向大家征集活动场地.志愿者.合作讲师\副讲 ...
- Salesforce 数据备份和恢复小知识
数据备份的类型 在Salesforce中可以使用多种API进行数据备份,它们是: REST API SOAP API Buik API Metadata API 数据备份有三种选择: 完全备份(Ful ...
- Python 多线程并发程序设计与分析
多线程并发程序设计与分析 by:授客 QQ:1033553122 1.技术难点分析与总结 难点1:线程运行时,运行顺序不固定 难点2:同一段代码,再不加锁的情况下,可能被多个线程同时执行,这会造成很多 ...
- Html富文本编辑器
本文推荐两款简单的富文本编辑器[KindEditor,NicEdit]用于获得所见即所得的编辑效果,本文仅供学习分享使用,如有不足之处,还请指正. 概述 这两款编辑器都是采用JavaScript编写, ...