用python刷LeetCode DAY 4
题目:977.有序数组的平方
题目要求:
暴力法解题思路:用for循环遍历列表中每一个元素并实现平方操作后,再对得到的列表实现排序,如下所示
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
for i in range(len(nums)):
nums[i] = nums[i]*nums[i]
nums.sort()
return nums
时间复杂度为O(nlogn)
若想要进一步降低时间复杂度,考虑到一开始的列表是有序的,只是平方过后,负数变成了正数,这是跟一般排序法相区别的地方。我们可以想到用双指针法,一个指向平方后列表的最左边元素,一个指向平方后列表的最右边元素,两者比大小后较大元素放在新列表的最右边,从后往前逐步更新存放结果的新列表
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
left = 0 # 定义left和right两个指针,分别指向列表的最左边和最右边元素
right = len(nums)-1
i = len(nums) -1
new_nums = [0] * len(nums) # 定义一个长度为len(nums) 且全为0的新列表
while left <= right: # 把nums中的元素平方后从大到小,从new_nums末位逐一往前更新
if nums[left]**2 <= nums[right]**2:
new_nums[i] = nums[right] ** 2
right -= 1 # 右指针向左移一位
else:
new_nums[i] = nums[left] ** 2
left += 1 # 左指针向右移一位
i -= 1 # 新列表的指针往前移一位
return new_nums
时间复杂度为O(n)