Create by jsliang on 2019-07-29 16:15:532019-07-29 17:09:31

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解法 - 暴力破解 | |  3.2 解法 - 二分查找 |

二 前言

  • 难度:简单

  • 涉及知识:数学、二分查找

  • 题目地址:https://leetcode-cn.com/problems/arranging-coins/

  • 题目内容

你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。
给定一个数字 n,找出可形成完整阶梯行的总行数。
n 是一个非负整数,并且在32位有符号整型的范围内。
示例 1:
n = 5
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤
因为第三行不完整,所以返回2.
示例 2:
n = 8
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤ ¤
¤ ¤
因为第四行不完整,所以返回3.

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - 暴力破解

  • 解题代码

var arrangeCoins = function(n) { let k = 0; while (n > 0) {  k++;  n = n - k; }   return n === 0 ? k : k - 1;
};
  • 执行测试

  1. n: 5

  2. return

2
  • LeetCode Submit

✔ Accepted   ✔ 1336/1336 cases passed (140 ms)   ✔ Your runtime beats 44.3 % of javascript submissions   ✔ Your memory usage beats 65.75 % of javascript submissions (36 MB)
  • 解题思路

首先,拿到题目,心中有了两种方案:

  1. 暴力破解法

  2. 二分查找法

然后,想了下 LeetCode 的尿性,暴力破解法不行的吧?

尝试了一下:

var arrangeCoins = function(n) {  let k = 0; while (n > 0) {  k++;  n = n - k; }   return n === 0 ? k : k - 1;
};

Submit 提交:

✔ Accepted    ✔ 1336/1336 cases passed (140 ms)   ✔ Your runtime beats 44.3 % of javascript submissions   ✔ Your memory usage beats 65.75 % of javascript submissions (36 MB)

咳咳,居然还是成功的~

最后,讲解下暴力思路:

  • 设置 k 为行数。

  • 循环 n,直到 n 小于或者等于 0 为止。

  • 每次循环, k+1,同时 n 减去 k(因为第 k 行有 k 个硬币)。

  • 最后看 n 是否为 0,如果是则刚好,返回 k,如果不是则返回 k-1

3.2 解法 - 二分查找

  • 解题代码

var arrangeCoins = function(n) {  if (!n) {   return 0;   }   // 第 k 行的结果值为 k * (k + 1) / 2  let sum = n * 2;   let left = 0;  let right = n; while (n) { let middle = Math.round((left + right) / 2);  if (middle * (middle + 1) === sum) {    return middle;  } else if (middle * (middle + 1) < sum) {   left = middle; } else {    right = middle;    }   if (left === right - 1) {    return left;    }   }
};
  • 执行测试

  1. n: 5

  2. return

2
  • LeetCode Submit

✔ Accepted   ✔ 1336/1336 cases passed (104 ms)   ✔ Your runtime beats 95.97 % of javascript submissions  ✔ Your memory usage beats 5.48 % of javascript submissions (37.2 MB)
  • 知识点

  1. Math:JS 中的内置对象,具有数学常数和函数的属性和方法。 Math 详细介绍

  • 解题思路

首先,在上面我们讲到了两种解法,解法 1 的暴力破解我们尝试过了,现在讲下二分查找方法。

然后,我们需要掺杂点数学知识:

  • 计算第 k 行的结果公式为: k*(k+1)/2

什么意思呢?

k = 1
sum = 1 * (1 + 1) / 2 = 1
k = 2
sum = 2 * (2 + 1) / 2 = 3
k = 3
sum = 3 * (3 + 1) / 2 = 6
k...
sum...

不要问我怎么知道的,我也忘记怎么推导的,但是脑海中记得小学就搞过这条规律,初中/高中的二元一次方式求过解。

那么,用二分查找法来推导,要怎么搞呢?

var arrangeCoins = function(n) { if (!n) {   return 0;   }   // 第 k 行的结果值为 k * (k + 1) / 2  let sum = n * 2;   let left = 0;  let right = n; while (n) { let middle = Math.round((left + right) / 2);  if (middle * (middle + 1) === sum) {    return middle;  } else if (middle * (middle + 1) < sum) {   left = middle; } else {    right = middle;    }   if (left === right - 1) {    return left;    }   }
};

如上所示,即二分查找法求解。

最后,我们通过两种方法成功破解了本题。

  • 进一步思考

还有没有其他方法呢?相信你有更好的求解!


不折腾的前端,和咸鱼有什么区别!

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。

LeetCode - 441 - 排列硬币(arranging-coins)相关推荐

  1. Java实现 LeetCode 441 排列硬币

    441. 排列硬币 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行数. n 是一个非负整数,并且在32位有符号整 ...

  2. LeetCode 441. 排列硬币(数学解方程)

    1. 题目 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行数. n 是一个非负整数,并且在32位有符号整型的范围 ...

  3. leetcode 441. 排列硬币(Java版)

    题目 https://leetcode-cn.com/problems/arranging-coins/ 题解 代码 for 循环中相乘要用 long,否则大数情况下会溢出 class Solutio ...

  4. 2022-2-5 Leetcode 441.排列硬币

    // class Solution {// public: // int arrangeCoins(int n) {// int i = 1; // for(;((1+i)*i)/2 <= n; ...

  5. 【leetcode刷题】[简单]441. 排列硬币(arranging coins)-java

    排列硬币 arranging coins 题目 分析 解答 题目 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行 ...

  6. Leetcode刷题100天—441. 排列硬币(数学)—day62

    前言: 作者:神的孩子在歌唱 大家好,我叫智 441. 排列硬币 难度简单155收藏分享切换为英文接收动态反馈 你总共有 n 枚硬币,并计划将它们按阶梯状排列.对于一个由 k 行组成的阶梯,其第 i ...

  7. 力扣441.排列硬币

    题目描述 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行数. n 是一个非负整数,并且在32位有符号整型的范围内 ...

  8. 《中英双解》leetCode Arranging Coins (排列硬币)

    Arranging Coins 难度简单182收藏分享切换为中文接收动态反馈 You have n coins and you want to build a staircase with these ...

  9. LeetCode刷题记录5——441. Arranging Coins(easy)

    LeetCode刷题记录5--441. Arranging Coins(easy) 目录 LeetCode刷题记录5--441. Arranging Coins(easy) 题目 语言 思路 后记 题 ...

最新文章

  1. golang语言变量定义、打印、占位符
  2. python的知识点运用_程序猿在Python编程中不得不使用的十二种基础知识
  3. js中字符串全部替换函数(正则表达式)
  4. split-lapply-cbind模式--R语言
  5. 【20180905】【计算机技术】为什么每次打印机都要手动设置双面打印?已解决~
  6. 基于spss的偏相关分析(partial correlation analysis)
  7. 颜色的原理,三基色原理以及HLS(色相、亮度、饱和度)原理
  8. 阿里云服务器(Centos7)安装谷歌浏览器
  9. 躲猫猫正式上线“Peek-a-Boo”就是“躲猫猫”
  10. 我写代码的这十年——致逝去的青春
  11. tp中ueditor编辑器的使用
  12. FFmpeg添加x265/hevc编码器支持
  13. Teardrop攻击--伪造虚假的IP数据包发送并抓取及完成简易静态网页
  14. k8s---存储之Volumes配置管理
  15. java计算方法所耗费的时间
  16. 清华大学霸榜计算机学科第一!2022 USNews世界大学排名出炉!
  17. 星球福利 | 读书的季节,送上豆瓣 Top10 区块链书单
  18. CC2640R2F BLE5.0 TI-RTOS概述
  19. 2016年兰州交通大学校园选拔赛
  20. ​案例 - 数据分析师市场需求 - 202301

热门文章

  1. 中国二维码--汉信码(中国主导的首个二维码码制国际标准「汉信码」ISO/IEC 20830:2021《信息技术 自动识别与数据采集技术 汉信码条码符号规范》)
  2. 3万字通俗易懂告诉你什么是.NET?什么是.NET Framework?什么是.NET Core?
  3. 头歌 初识Redis
  4. PostgreSQL 收缩膨胀表或索引 - pg_squeeze or pg_repack
  5. 华三模拟器命令(陆续更新)
  6. Found duplicate code in xxx,Inspection info: Finds duplicated code
  7. 全国大学生数学建模竞赛(赛题选择)
  8. Mysql基础篇(10)—— MySQL8.0新特性概览
  9. MutationObserver监测qrcodejs2二维码生成失败
  10. 经验分享:半桥电路的工作原理及注意问题(转载)