Skip to content

Commit d6cc734

Browse files
Add solutions for binary search problems: sqrt and arrange coins
Implemented two functions, `sqrt` and `arrange_coins`, using binary search to solve LeetCode problems. Included comprehensive unit tests covering small, large, and edge case inputs to ensure correctness and reliability of both algorithms.
1 parent 7afab9b commit d6cc734

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# https://leetcode.com/problems/arranging-coins
2+
3+
import unittest
4+
5+
6+
def arrange_coins(n: int) -> int:
7+
left = 0
8+
right = n
9+
10+
while left <= right:
11+
k = (left + right) // 2
12+
13+
current = k * (k + 1) // 2
14+
15+
if current == n:
16+
return k
17+
18+
if current < n:
19+
left = k + 1
20+
else:
21+
right = k - 1
22+
23+
return right
24+
25+
26+
class TestArrangeCoins(unittest.TestCase):
27+
def test_small_numbers(self):
28+
self.assertEqual(arrange_coins(0), 0)
29+
self.assertEqual(arrange_coins(1), 1)
30+
self.assertEqual(arrange_coins(2), 1)
31+
self.assertEqual(arrange_coins(3), 2)
32+
33+
def test_medium_numbers(self):
34+
self.assertEqual(arrange_coins(5), 2)
35+
self.assertEqual(arrange_coins(8), 3)
36+
self.assertEqual(arrange_coins(10), 4)
37+
38+
def test_large_numbers(self):
39+
self.assertEqual(arrange_coins(10000), 140)
40+
self.assertEqual(arrange_coins(500000), 999)
41+
42+
def test_boundary_conditions(self):
43+
self.assertEqual(arrange_coins(15), 5) # Fully filled staircase
44+
self.assertEqual(arrange_coins(16), 5) # 15 + 1 extra coin
45+
self.assertEqual(arrange_coins(17), 5)

Binary Search/Math/sqrt.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# https://leetcode.com/problems/sqrtx
2+
3+
import unittest
4+
5+
6+
def sqrt(x: int) -> int:
7+
if x < 2:
8+
return x
9+
10+
left = 2
11+
right = x // 2
12+
13+
while left <= right:
14+
mid = (left + right) // 2
15+
16+
num = mid * mid
17+
18+
if num == x:
19+
return mid
20+
21+
if num < x:
22+
left = mid + 1
23+
else:
24+
right = mid - 1
25+
26+
return right
27+
28+
29+
class TestSqrtFunction(unittest.TestCase):
30+
def test_small_numbers(self):
31+
self.assertEqual(sqrt(0), 0) # Square root of 0 is 0
32+
self.assertEqual(sqrt(1), 1) # Square root of 1 is 1
33+
self.assertEqual(sqrt(2), 1) # Closest integer square root of 2 is 1
34+
35+
def test_perfect_squares(self):
36+
self.assertEqual(sqrt(4), 2) # 2^2 = 4
37+
self.assertEqual(sqrt(9), 3) # 3^2 = 9
38+
self.assertEqual(sqrt(16), 4) # 4^2 = 16
39+
self.assertEqual(sqrt(25), 5) # 5^2 = 25
40+
41+
def test_non_perfect_squares(self):
42+
self.assertEqual(sqrt(8), 2) # Closest integer square root of 8 is 2
43+
self.assertEqual(sqrt(10), 3) # Closest integer square root of 10 is 3
44+
self.assertEqual(sqrt(27), 5) # Closest integer square root of 27 is 5
45+
46+
def test_large_numbers(self):
47+
self.assertEqual(sqrt(1000000), 1000) # Perfect square
48+
self.assertEqual(sqrt(1234567), 1111) # Closest integer square root of 1234567
49+
50+
def test_edge_cases(self):
51+
self.assertEqual(
52+
sqrt(2147395599), 46339
53+
) # Largest x for which x^2 still fits in an int (32-bit)
54+
self.assertEqual(
55+
sqrt(2147483647), 46340
56+
) # Input is the max 32-bit integer, square root approximates

0 commit comments

Comments
 (0)