给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序
进阶:请你设计时间复杂度为 O(n)
的算法解决本问题
暴力解决:
def sortedSquares(nums):
"""
:param nums:
"""
lst = list()
for i in nums:
temp = i**2
lst.append(temp)
return sorted(lst)
a = [-4, -1, 0, 3, 10]
print(sortedSquares(a))
[0, 1, 9, 16, 100]
或者
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
lst = list()
for i in nums:
temp = i**2
lst.append(temp)
return sorted(lst)
这种做法时间复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),更快的做法是利用双指针,通过建立左右两个指针,将两个指针所指的值中绝对值大的放到后面,然后接着比较。
利用题目中数组是有序的这个条件,先找到负数与正数的分界值,分别定义两个指针从分界处开始比较两指针所指的值的平方,将小的插入新的数组中。直到一方索引完,另一方就直接按顺序插入数组。
def sortedSquares(nums):
"""
:param nums:
:return:
"""
n = len(nums)
poi = -1
for i, num in enumerate(nums):
if num < 0:
poi = i
else:
break
li = list()
i, j = poi, poi+1
while i >= 0 or j < n:
if i < 0:
li.append(nums[j]**2)
j += 1
elif j == n:
li.append(nums[i]**2)
i -= 1
elif nums[i]**2 < nums[j]**2:
li.append(nums[i]**2)
i -= 1
else:
li.append(nums[j]**2)
j += 1
return li
ans = [-4, -1, 0, 3, 10]
print(sortedSquares(ans))
[0, 1, 9, 16, 100]