Skip to content

Commit 7eeef12

Browse files
authored
Merge pull request #1591 from ivanpenaloza/march29
adding algo
2 parents 018074c + ebf7321 commit 7eeef12

5 files changed

Lines changed: 182 additions & 0 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import List, Union, Collection, Mapping, Optional
2+
from abc import ABC, abstractmethod
3+
4+
class Solution:
5+
def twoSum(self, nums: List[int], target: int) -> List[int]:
6+
7+
answer = dict()
8+
9+
for k, v in enumerate(nums):
10+
11+
if v in answer:
12+
return [answer[v], k]
13+
else:
14+
answer[target - v] = k
15+
16+
return []
17+
18+
19+
20+
21+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from typing import List, Union, Collection, Mapping, Optional
2+
from abc import ABC, abstractmethod
3+
import re
4+
5+
class Solution:
6+
def isPalindrome(self, s: str) -> bool:
7+
8+
# To lowercase
9+
s = s.lower()
10+
11+
# Remove non-alphanumeric characters
12+
s = re.sub(pattern=r'[^a-zA-Z0-9]', repl='', string=s)
13+
14+
# Determine if s is palindrome or not
15+
len_s = len(s)
16+
17+
for i in range(len_s//2):
18+
19+
if s[i] != s[len_s - 1 - i]:
20+
return False
21+
22+
return True
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def findMin(self, nums: List[int]) -> int:
6+
"""
7+
Find the minimum element in a rotated sorted array.
8+
9+
Time Complexity: O(log n) - binary search
10+
Space Complexity: O(1) - constant space
11+
12+
Args:
13+
nums: A rotated sorted array of unique elements
14+
15+
Returns:
16+
The minimum element in the array
17+
"""
18+
left = 0
19+
right = len(nums) - 1
20+
21+
# If array is not rotated or has only one element
22+
if nums[left] <= nums[right]:
23+
return nums[left]
24+
25+
while left < right:
26+
mid = left + (right - left) // 2
27+
28+
# If mid element is greater than rightmost element,
29+
# the minimum must be in the right half
30+
if nums[mid] > nums[right]:
31+
left = mid + 1
32+
else:
33+
# The minimum is in the left half (including mid)
34+
right = mid
35+
36+
return nums[left]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
function findMin(nums: number[]): number {
2+
let left = 0;
3+
let right = nums.length - 1;
4+
5+
// If array is not rotated or has only one element
6+
if (nums[left] <= nums[right]) {
7+
return nums[left];
8+
}
9+
10+
while (left < right) {
11+
const mid = Math.floor(left + (right - left) / 2);
12+
13+
// If mid element is greater than rightmost element,
14+
// the minimum must be in the right half
15+
if (nums[mid] > nums[right]) {
16+
left = mid + 1;
17+
} else {
18+
// The minimum is in the left half (including mid)
19+
right = mid;
20+
}
21+
}
22+
23+
return nums[left];
24+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import unittest
2+
from typing import List
3+
from src.my_project.interviews.top_150_questions_round_22\
4+
.ex_114_find_minimum_in_rotated_sorted_array import Solution
5+
6+
7+
class FindMinimumInRotatedSortedArrayTestCase(unittest.TestCase):
8+
def setUp(self):
9+
self.solution = Solution()
10+
11+
def test_example_1_rotated_3_times(self):
12+
"""Test: nums = [3,4,5,1,2], expected = 1"""
13+
nums = [3, 4, 5, 1, 2]
14+
expected = 1
15+
result = self.solution.findMin(nums)
16+
self.assertEqual(result, expected)
17+
18+
def test_example_2_rotated_4_times(self):
19+
"""Test: nums = [4,5,6,7,0,1,2], expected = 0"""
20+
nums = [4, 5, 6, 7, 0, 1, 2]
21+
expected = 0
22+
result = self.solution.findMin(nums)
23+
self.assertEqual(result, expected)
24+
25+
def test_example_3_no_rotation_or_full_rotation(self):
26+
"""Test: nums = [11,13,15,17], expected = 11"""
27+
nums = [11, 13, 15, 17]
28+
expected = 11
29+
result = self.solution.findMin(nums)
30+
self.assertEqual(result, expected)
31+
32+
def test_single_element(self):
33+
"""Test: nums = [1], expected = 1"""
34+
nums = [1]
35+
expected = 1
36+
result = self.solution.findMin(nums)
37+
self.assertEqual(result, expected)
38+
39+
def test_two_elements_rotated(self):
40+
"""Test: nums = [2,1], expected = 1"""
41+
nums = [2, 1]
42+
expected = 1
43+
result = self.solution.findMin(nums)
44+
self.assertEqual(result, expected)
45+
46+
def test_two_elements_not_rotated(self):
47+
"""Test: nums = [1,2], expected = 1"""
48+
nums = [1, 2]
49+
expected = 1
50+
result = self.solution.findMin(nums)
51+
self.assertEqual(result, expected)
52+
53+
def test_minimum_at_beginning(self):
54+
"""Test: nums = [1,2,3,4,5], expected = 1"""
55+
nums = [1, 2, 3, 4, 5]
56+
expected = 1
57+
result = self.solution.findMin(nums)
58+
self.assertEqual(result, expected)
59+
60+
def test_minimum_at_end(self):
61+
"""Test: nums = [2,3,4,5,1], expected = 1"""
62+
nums = [2, 3, 4, 5, 1]
63+
expected = 1
64+
result = self.solution.findMin(nums)
65+
self.assertEqual(result, expected)
66+
67+
def test_minimum_in_middle(self):
68+
"""Test: nums = [5,6,7,1,2,3,4], expected = 1"""
69+
nums = [5, 6, 7, 1, 2, 3, 4]
70+
expected = 1
71+
result = self.solution.findMin(nums)
72+
self.assertEqual(result, expected)
73+
74+
def test_large_rotation(self):
75+
"""Test: nums = [6,7,8,9,10,1,2,3,4,5], expected = 1"""
76+
nums = [6, 7, 8, 9, 10, 1, 2, 3, 4, 5]
77+
expected = 1
78+
result = self.solution.findMin(nums)
79+
self.assertEqual(result, expected)

0 commit comments

Comments
 (0)