leetcode441(巧妙利用取整和解方程)
You have a total of n coins that you want to form in a staircase shape, where every k-th row must have exactly k coins.
Given n, find the total number of full staircase rows that can be formed.
n is a non-negative integer and fits within the range of a 32-bit signed integer.
Example 1:
n = 5 The coins can form the following rows:
¤
¤ ¤
¤ ¤ Because the 3rd row is incomplete, we return 2.
Example 2:
n = 8 The coins can form the following rows:
¤
¤ ¤
¤ ¤ ¤
¤ ¤ Because the 4th row is incomplete, we return 3.
首先理解题目的意思
给出一个数N,然后利用这个数去排列。
每行尽可能排满,第一行1个,第二行2个。。。。
返回排满的行数
首先列出看的见的等式。
(1+x)*x/2 + r = n;
其中x为最后有多少行,r为最后返回的结果,n为给出的数据。
//然后我们就把这个问题转换成了一个数学问题
也就是我们要计算出一个x要满足等式成立的情况下r最小。
如何找到这个x呢?
1、首先最简单的解法,枚举所有的x,直到r为负数为止,前一个x就是满足条件的。
所以最后的复杂度肯定是x+1,x为最终成立的行数,x为需要返回的结果。
还有更快的方法吗?
我的想法是,当r为0时,x可以从sqrt(n*2)向下取整,然后从这个数,按照方法1往上找。这个是n最大的情况
当r为x-1时,也就是n最小的情况。按照上面的方法也没错,因为这个数小,所以往上找也是可以的。
public class Solution {
public int arrangeCoins(int n) {
int x = (int) Math.floor(Math.sqrt(n*1.0));
int r = 0;
while (true){
if(x%2 == 0)
r = x / 2 * (1+x);
else
r = (1+x) / 2 * x;
if(n - r < 0)
break;
else
x++;
}
return --x;
}
}
其中要注意的是x的值过大时先要计算除法不然两个数相乘超过int就会出现一个极小数会影响判断。
当然还有更牛逼的方法
先不管r是多少,当做r是0,先利用解方程的方法n计算出来一个x
然后对这个x往小了取整数就可以了。
public class Solution {
public int arrangeCoins(int n) {
/* 数学推导
(1+k)*k/2 = n
k+k*k = 2*n
k*k + k + 0.25 = 2*n + 0.25
(k + 0.5) ^ 2 = 2*n +0.25
k + 0.5 = sqrt(2*n + 0.25)
k = sqrt(2*n + 0.25) - 0.5
*/
return (int) (Math.sqrt(2*(long)n+0.25) - 0.5);
}
}
leetcode441(巧妙利用取整和解方程)的更多相关文章
- Javascript-数值运算 保留小数点位数,并对最后一位小数各种取整方法
今天遇到Javascript数值运算的坑,说到底,还是用得少啊.得多用多敲代码多遇坑. 先介绍以下三个Javascript number取整运算方法. Math.floor() 对一个数退一取整 例: ...
- 一类巧妙利用利用失配树的序列DP
I.导入 求长度为\(\text{len}\)的包含给定连续子串\(\text{T}\)的 0/1 串的个数.(\(|T|<=15\)) 通常来说这种题目应该立刻联想到状压 DP 与取反集--这 ...
- scrapy进阶(CrawlSpider爬虫__爬取整站小说)
# -*- coding: utf-8 -*- import scrapy,re from scrapy.linkextractors import LinkExtractor from scrapy ...
- js 为何范围内随机取整要用floor,而不是ceil或者round呢
壹 ❀ 引 我在如何使用js取任意范围内随机整数这篇博客中,列举并分析了取[n,m)与[n,m]范围内整数的通用方法,并在文章结果留了一个疑问:为什么通用方法中取整操作,我们使用Math.floor ...
- JS基础入门篇(三)— for循环,取余,取整。
1.for循环 1.for的基本简介 作用: 根据一定的条件,重复地执行一行或多行代码 语法: for( 初始化 ; 判断条件 ; 条件改变 ){ 代码块 } 2.for循环的执行顺序 <bod ...
- 巧妙利用Camtasia制作网课
随着互联网的快速发展,网络学习变得非常流行.这种躺在床上就可以获取知识的方法让大家渐渐地都喜欢上了学习,那么我们是否想要了解一下网课的幕后制作呢. 今天我给大家带来的便是巧妙利用Camtasia进行网 ...
- Python技法:浮点数取整、格式化和NaN处理
1. 取整的三种方法 1.1 强转int类型 这种方法会直接对浮点数的小数部分进行截断(无论是正还是负). print(int(2.7)) # 2 print(int(-2.7)) # -2 1.2 ...
- ios小数向上、下取整,计算结果向上、下取整
[摘要:小数背上与整,指小数局部间接进1 x=3.14, ceilf (x)=4 小数背下与整,指间接往失落小数局部 x=3.14,floor(x)=3 盘算效果背上与整 A被除数,B除数 ,(AB- ...
- Java Math 取整的方式
1.Math.floor floor,英文原意:地板. Math.floor 函数是求一个浮点数的地板,就是 向下 求一个最接近它的整数,它的值肯定会小于或等于这个浮点数. 2.Math.ceil c ...
随机推荐
- Specified key was too long; max key length is 767 b
alter table - engine=innodb,row_format=dynamic; Specified key was too long; max key length is 767 b
- jq siblings()的强大之处
在事件处理的方法里 经常遇到自己做什么效果 其他节点就做反之效果 如果用判断 可处理 但代码太啰嗦不够简单 siblings()就可以解决这一切的麻烦 意思就是 除啦我之外的其他兄弟节点 这样可以做2 ...
- Webpack学习笔记(二)
市面上已经存在的模块管理和打包工具并不适合大型的项目,尤其单页面 Web 应用程序.最紧迫的原因是如何在一个大规模的代码库中,维护各种模块资源的分割和存放,维护它们之间的依赖关系,并且无缝的将它们整合 ...
- C#入门经典中的SelectionFont属性为null
14.6.2.richtextbox控件: private void buttonbold_click(object sender, eventargs e) { ...
- CSU 1640 机智的刷题方式
完全背包 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...
- java线程condition
子线程先执行一段代码,再主线程再执行一段代码,两个线程都循环执行50遍.用2个condition来实现,一个是子线程的condition,一个是主线程的condition,代码如下: package ...
- ValidationMessageFor验证
一,在modle下的自己新建的PowerViewModel.cs下编辑错误显示 public class PowerViewModel { [Required( ErrorMess ...
- windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境)
推荐几款一键快速搭建PHP本地运行环境的好工具(含php7.0及apache,nigix,mysql) 首推phpstudy2016和wampServer3.0.6 理由支持php7.0 目前 ...
- POJ 2068 Nim#双人dp博弈
http://poj.org/problem?id=2068 #include<iostream> #include<cstdio> #include<cstring&g ...
- 关于如何用Jquery监听鼠标滚轮改变横向滚动条
$(function(){ if ((navigator.userAgent.indexOf('MSIE') >= 0)){/*判断是否是IE浏览器*/ var scroll_width = 1 ...