class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
i=0
for i in range(len(nums)):
nums[i]=nums[i]*nums[i]
nums.sort()
return nums
题解给出的双指针法的时间复杂度最小。
(版本一)双指针法
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
l, r, i = 0, len(nums)-1, len(nums)-1
res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
while l <= r:
if nums[l] ** 2 < nums[r] ** 2: # 左右边界进行对比,找出最大值
res[i] = nums[r] ** 2
r -= 1 # 右指针往左移动
else:
res[i] = nums[l] ** 2
l += 1 # 左指针往右移动
i -= 1 # 存放结果的指针需要往前平移一位
return res
[float('inf')] * len(nums)
是创建一个列表,列表的长度由 nums
变量的长度决定,列表中的每个元素都是正无穷大(float('inf')
)。
float('inf')
表示正无穷大,是一个特殊的浮点数,表示比任何其他数值都要大的数。[float('inf')]
创建了一个只包含一个元素的列表,这个元素是正无穷大。* len(nums)
是列表乘法操作,将[float('inf')]
列表重复len(nums)
次,len(nums)
表示nums
列表的长度。
例如,如果 nums
是一个长度为3的列表,那么 [float('inf')] * len(nums)
将创建一个新的列表 [inf, inf, inf]
。
还有一种更简单列表推导法,但是时间复杂度没有双指针小。
(版本三)暴力排序法+列表推导法
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted(x*x for x in nums)