LeetCode //C - 441. Arranging Coins

441. Arranging Coins

You have n coins and you want to build a staircase with these coins. The staircase consists of k rows where the i t h i^{th} ith row has exactly i coins. The last row of the staircase may be incomplete.

Given the integer n, return the number of complete rows of the staircase you will build.

Example 1:

Input: n = 5
Output: 2
Explanation: Because the 3 r d 3^{rd} 3rd row is incomplete, we return 2.

Example 2:

Input: n = 8
Output: 3
Explanation: Because the 4 t h 4^{th} 4th row is incomplete, we return 3.

Constraints:
  • 1 < = n < = 2 31 − 1 1 <= n <= 2^{31} - 1 1<=n<=231−1

From: LeetCode

Link: 441. Arranging Coins


Solution:

Ideas:

1. Binary Search: This is an efficient algorithm used to find an item in a sorted list. The algorithm repeatedly divides the range of possible solutions in half, choosing the half where the item must be, until it narrows down to the exact location.

2. Using the Formula for the Sum of Natural Numbers: To find how many coins are needed to completely fill k rows, the formula k * (k + 1) / 2 is used. This is the sum of the first k natural numbers, and in the context of this problem, it represents the total number of coins needed to fill k rows of the staircase.

3. Finding the Maximum k: The goal is to find the largest k such that k * (k + 1) / 2 is less than or equal to n. This k represents the number of complete rows you can build with n coins.

4. Binary Search Implementation:

  • The search starts with the full range of possible row counts (left at 0 and right at n).
    It repeatedly calculates the middle point (mid) and the number of coins needed to fill that many rows (curr).
  • If curr equals n, we've found the exact number of rows we can fill and return mid.
  • If curr is greater than n, we have too many rows, so we reduce the search range to the left half.
  • If curr is less than n, we have too few rows, so we increase the search range to the right half.
  • The search stops when left exceeds right, meaning we've narrowed down the range as much as possible. At this point, right will be the greatest number of complete rows that can be built with n coins.
Code:
c 复制代码
int arrangeCoins(int n) {
    long left = 0, right = n;
    long mid, curr;
    
    while (left <= right) {
        mid = left + (right - left) / 2;
        curr = mid * (mid + 1) / 2;
        
        if (curr == n) return (int)mid;
        
        if (n < curr) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    
    return (int)right;
}
相关推荐
csdn_aspnet1 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
谙弆悕博士1 小时前
【附C源码】从零实现C语言堆数据结构:原理、实现与应用
c语言·数据结构·算法··数据结构与算法
gaosushexiangji4 小时前
DIC系统推荐:基于千眼狼三维数字图像相关的无人机旋翼疲劳试验全场应变与位移测量
人工智能·算法
小王C语言6 小时前
【线程概念与控制】:线程封装
jvm·c++·算法
圣保罗的大教堂6 小时前
leetcode 796. 旋转字符串 简单
leetcode
kyle~6 小时前
工程数学---点云配准卡布施(Kabsch)算法(求解最优旋转矩阵)
线性代数·算法·矩阵
三品吉他手会点灯6 小时前
C语言学习笔记 - 35.数据类型 - printf函数的非输出控制符与格式优化
c语言·开发语言·笔记·学习
张二娃同学6 小时前
03_变量常量与输入输出_printf与scanf详解
算法
江南十四行7 小时前
并发编程(一)
java·jvm·算法
Ghost Face...7 小时前
U-Boot SPL阶段与主阶段深度解析:从ROM到Kernel的完整引导之旅(ARMv8)
c语言