一、题目复述
1. 题目
给定一个非递减顺序排序的整数数组,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
二、代码实现
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
# Method 1. 直接排序(① sorted函数 ② 如何返回数组元素的平方)
# return sorted(num * num for num in nums)
# Method 2. 双指针:使用两个指针分别指向位置首尾,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针
# 由后向前
# n = len(nums)
# ans = [0] * n
# i, j, pos = 0, n-1, n-1
# while i <= j:
# if nums[i] * nums[i] < nums[j] * nums[j]:
# ans[pos] = nums[j] * nums[j]
# j -= 1
# else:
# ans[pos] = nums[i] * nums[i]
# i += 1
# pos -= 1
# return ans
# Method 3. 双指针:归并排序,找到中界点,然后从小到大(相对来讲,要复杂一些)
# 使用两个指针分别指向位置 neg 和 neg+1,其中,neg表示负数和非负数的分界线
# 每次比较两个指针对应的数,选择较小的那个放入答案并移动指针。当某一指针移至边界时,将另一指针还未遍历到的数依次放入答案。
n = len(nums)
negative = -1
for i, num in enumerate(nums):
if num < 0:
negative = i
else:
break
ans = list()
i, j = negative, negative + 1
while i >= 0 or j < n:
if i < 0:
ans.append(nums[j] * nums[j])
j += 1
elif j == n:
ans.append(nums[i] * nums[i])
i -= 1
elif nums[i] * nums[i] < nums[j] * nums[j]:
ans.append(nums[i] * nums[i])
i -= 1
else:
ans.append(nums[j] * nums[j])
j += 1
return ans
四、链接