-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlc977_squares_of_sorted_array.py
92 lines (74 loc) · 2.57 KB
/
lc977_squares_of_sorted_array.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""
Given an integer array nums sorted in non-decreasing order,
return an array of the squares of each number sorted in non-decreasing order.
Example 1:
Input: nums = [-4,-1,0,3,10]
Output: [0,1,9,16,100]
Explanation: After squaring, the array becomes [16,1,0,9,100].
After sorting, it becomes [0,1,9,16,100].
Example 2:
Input: nums = [-7,-3,2,3,11]
Output: [4,9,9,49,121]
Constraints:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums is sorted in non-decreasing order.
Follow up: Squaring each element and sorting the new array is very trivial,
could you find an O(n) solution using a different approach?
"""
import unittest
def sorted_squares_brute_force(nums: list[int]) -> list[int]:
"""
Time Complexity: O(n log n)
Space Complexity: O(n)
"""
result = []
for num in nums:
result.append(num * num)
result.sort()
return result
def sorted_squares_map(nums: list[int]) -> list[int]:
"""
Time Complexity: O(n log n)
Space Complexity: O(n)
"""
return sorted(list(map(lambda x: x * x, nums)))
def sorted_squares_using_two_pointers(nums: list[int]) -> list[int]:
"""
Time Complexity: O(n)
Space Complexity: O(1)
"""
left, right = 0, len(nums) - 1
result = [0] * len(nums)
for i in range(len(nums) - 1, -1, -1):
if abs(nums[left]) > abs(nums[right]):
result[i] = nums[left] * nums[left]
left += 1
else:
result[i] = nums[right] * nums[right]
right -= 1
return result
class TestSquaresOfSortedArray(unittest.TestCase):
"""
Test Squares of a sorted array problem
"""
def test_squares_of_sorted_array_brute_force(self):
"""
Test sorted_squares_brute_force method
"""
self.assertEqual(sorted_squares_brute_force([-4,-1,0,3,10]), [0,1,9,16,100])
self.assertEqual(sorted_squares_brute_force([-7,-3,2,3,11]), [4,9,9,49,121])
def test_squares_of_sorted_array_map(self):
"""
Test sorted_squares_brute_force method
"""
self.assertEqual(sorted_squares_map([-4,-1,0,3,10]), [0,1,9,16,100])
self.assertEqual(sorted_squares_map([-7,-3,2,3,11]), [4,9,9,49,121])
def test_sorted_squares_using_two_pointers(self):
"""
Test sorted_squares_using_two_pointers method
"""
self.assertEqual(sorted_squares_using_two_pointers([-4,-1,0,3,10]), [0,1,9,16,100])
self.assertEqual(sorted_squares_using_two_pointers([-7,-3,2,3,11]), [4,9,9,49,121])
if __name__ == "__main__":
unittest.main()