Solve 977 Squares of a Sorted Array
This commit is contained in:
parent
30e48785a8
commit
c4a613dd84
78
python/977_squares_of_a_sorted_array.py
Normal file
78
python/977_squares_of_a_sorted_array.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
class Solution:
|
||||||
|
def sortedSquares(self, nums: List[int]) -> List[int]:
|
||||||
|
negative_end = 0
|
||||||
|
while negative_end < len(nums) and nums[negative_end] < 0:
|
||||||
|
negative_end += 1
|
||||||
|
|
||||||
|
return self.merge(
|
||||||
|
[x ** 2 for x in reversed(nums[:negative_end])],
|
||||||
|
[x ** 2 for x in nums[negative_end:]]
|
||||||
|
)
|
||||||
|
|
||||||
|
def merge(self, list1: List[int], list2: List[int]) -> List[int]:
|
||||||
|
left1 = 0
|
||||||
|
left2 = 0
|
||||||
|
new = []
|
||||||
|
|
||||||
|
while left1 < len(list1) and left2 < len(list2):
|
||||||
|
if list1[left1] < list2[left2]:
|
||||||
|
new.append(list1[left1])
|
||||||
|
left1 += 1
|
||||||
|
else:
|
||||||
|
new.append(list2[left2])
|
||||||
|
left2 += 1
|
||||||
|
|
||||||
|
while left1 < len(list1):
|
||||||
|
new.append(list1[left1])
|
||||||
|
|
||||||
|
while left2 < len(list2):
|
||||||
|
new.append(list1[left1])
|
||||||
|
|
||||||
|
return new
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Alternative solution with the work done manually to save on unneeded copying
|
||||||
|
|
||||||
|
class Solution:
|
||||||
|
def sortedSquares(self, nums: List[int]) -> List[int]:
|
||||||
|
l = len(nums)
|
||||||
|
|
||||||
|
negative_end = 0
|
||||||
|
while negative_end < l and nums[negative_end] < 0:
|
||||||
|
negative_end += 1
|
||||||
|
|
||||||
|
# Square the array
|
||||||
|
for i in range(l):
|
||||||
|
nums[i] = nums[i] ** 2
|
||||||
|
|
||||||
|
# Reverse the negative part of the array
|
||||||
|
for i in range(negative_end // 2):
|
||||||
|
nums[i], nums[negative_end-i-1] = nums[negative_end-i-1], nums[i]
|
||||||
|
|
||||||
|
|
||||||
|
# Merge the parts together
|
||||||
|
new = []
|
||||||
|
|
||||||
|
left = 0
|
||||||
|
right = negative_end
|
||||||
|
|
||||||
|
while left < negative_end and right < l:
|
||||||
|
if nums[left] < nums[right]:
|
||||||
|
new.append(nums[left])
|
||||||
|
left += 1
|
||||||
|
else:
|
||||||
|
new.append(nums[right])
|
||||||
|
right += 1
|
||||||
|
|
||||||
|
while left < negative_end:
|
||||||
|
new.append(nums[left])
|
||||||
|
left += 1
|
||||||
|
|
||||||
|
while right < l:
|
||||||
|
new.append(nums[right])
|
||||||
|
right += 1
|
||||||
|
|
||||||
|
return new
|
||||||
|
|
||||||
|
"""
|
Loading…
Reference in New Issue
Block a user