题目:

你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。

给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。

示例 1:

输入:n = 5

输出:2

解释:因为第三行不完整,所以返回 2 。

示例 2:

输入:n = 8

输出:3

解释:因为第四行不完整,所以返回 3 。

提示:

  • 1 <= n <= 2^31 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/arranging-coins
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【二分查找】

1.初始化left = 1, right = n,计算出mid = left + (right - left + 1) / 2,等差数列的前n项和公式:sum =  n * (n + 1) / 2(首项和公差都为1),计算出包括mid项以及之前的和;

2.循环条件:left < right:

  • sum <= n 时,说明mid以及mid以后的数可能为答案,即缩小搜索区间为:[mid, right](注意这里区间的死循环哦!故mid才向上取整);
  • sum > n 时,说明mid之前的数才可能为答案,即缩小搜索区间为:[left, mid-1];

3.循环结束的条件: left == right,区间缩小为一个点,故返回left 或者right都可以。

java代码:

 1 class Solution {
2 public int arrangeCoins(int n) {
3 int left = 1, right = n;
4 while (left < right){
5 int mid = left + (right - left + 1) / 2;
6 long sum = (long) mid * (mid + 1) / 2;
7 //区间为:[mid, right]
8 if(sum <= n){
9 left = mid;
10 }else {
11 //区间为:[left, mid - 1]
12 right = mid - 1;
13 }
14 }
15 return left;
16 }
17 }

python3代码:

 1 class Solution:
2 def arrangeCoins(self, n: int) -> int:
3 left, right = 1, n
4 while left <= right:
5 mid = left + (right - left) // 2
6 sum = mid * (mid + 1) // 2
7 if sum < n:
8 left = mid + 1
9 elif sum > n:
10 right = mid - 1
11 else:
12 return mid
13 # 循环结束,left比right大1,找小的那个
14 return right

 【数学方法】:

等差数列的前n项和公式:sum =  x * (x + 1) / 2(首项和公差都为1),这里需要求 x * (x + 1) / 2 < = n,求得x的最大值,解一元二次不等式:得到关于x的不等式为:

 java代码为:

1 class Solution {
2 public int arrangeCoins(int n) {
3 return (int)((Math.sqrt(1 + (long)8 * n) - 1) / 2);
4 }
5 }

力扣441(java&python)-排列硬币(简单)的更多相关文章

  1. 力扣题解-LCP 06. 拿硬币

    题目描述 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释: ...

  2. 力扣567.字符串的排列—C语言实现

    题目 来源:力扣(LeetCode)

  3. 441 Arranging Coins 排列硬币

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

  4. [LeetCode] 441. Arranging Coins 排列硬币

    You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...

  5. 力扣——Next Permutation(下一个排列) python实现

    题目描述: 中文: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  6. Java实现 LeetCode 441 排列硬币

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

  7. Leetcode之二分法专题-441. 排列硬币(Arranging Coins)

    Leetcode之二分法专题-441. 排列硬币(Arranging Coins) 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形 ...

  8. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  9. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  10. 力扣—Reorder List(重排链表)python实现

    题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...

随机推荐

  1. openlayers.org 百度地图 静态化 同类产品

    openlayers 官网 https://openlayers.org/ 发现不好打开,修改dns 114.114.114.114 202.99.104.68 打开快了许多 https://blog ...

  2. day13-Servlet03

    Servlet03 11.练习 快捷键-可以快速地在访问的文件件切换 ctrl+alt+向左箭头:回到上次访问的位置 ctrl+alt+向右箭头:回到下一步访问的位置 11.1CatServlet 首 ...

  3. 人人都是艺术家!AI工具Doodly让潦草手绘变精美画作

    AI绘画界太卷了,一天一个新东西,不久前刚给大家介绍了可以一秒出图的SDXL-Turbo,今天来聊一聊另一位重磅选手Doodly 有用过Stable Diffuison的小伙伴都知道,想要生成一张高质 ...

  4. js使用typeof与instanceof相结合编写一个判断常见变量类型的函数

    /** * 常见类型判断 * @param {any} param */ function getParamType(param) { // 先判断是否能用typeof 直接判断 let types1 ...

  5. C#调用百度翻译API自动将中文转化为英文

    1.百度翻译开放平台在平台申请你自己的appid,和密钥 2.开通后就在我提供的gitee链接下载代码,直接修改秘钥和appid就能使用如下图所示 3.Gitee链接:链接 4.https://git ...

  6. BeanUtils.copyProperties() 详解

    BeanUtils.copyProperties会进行类型转换:BeanUtils.copyProperties方法简单来说就是将两个字段相同的对象进行属性值的复制. 如果 两个对象之间存在名称不相同 ...

  7. IntelliJ IDEA 设置类和方法注释

    一.在创建类和文件的时候加注释 1.创建类 在右侧输入: 1 /** 2 * 3 * @author ${USER} 4 * @date ${YEAR}-${MONTH}-${DAY} ${TIME} ...

  8. MySQL索引Innodb存储引擎

    MySQL索引优化 一.基础理解 MySQL语句的查询效率主要和索引树的高度有关,想要降低查询的次数提高查询的速度,减少直接对磁盘的I/O流的次数,就要让索引树的高度越低越好. 索引的定义:索引是帮助 ...

  9. 在Ubuntu上安装MySQL

    在Ubuntu上安装MySQL sudo apt update sudo apt install mysql-server 安装完成后,MySQL服务将自动启动.要验证MySQL服务器正在运行,请输入 ...

  10. #斜率优化,二分#CF631E Product Sum

    题目 有一个数列 \(a\),其权值为 \(\sum_{i=1}^ni*a_i\), 现在可以任意选择其中一个数字扔到任意位置,使权值和最大. \(n\leq 2*10^5,|a_i|\leq 10^ ...