1:题目描述(力扣)
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
2:解题思路
解题方法一:暴力解法
将数组的每个元素先求平方,再将数组进行排序
代码展示:
# 暴力解法:先对数组的元素进行平方操作,再排序
class Solution:
def sortedSquares(self, nums):
for i in range(len(nums)):
nums[i] = nums[i] * nums[i]
nums.sort()
return nums
解题方法二:使用双指针
第一步:初始化左右双指针,left, right = 0, len(nums)-1
第二步:定义一个新数组,长度与nums保持一致,元素使用“-1”占位;初始化新数组最右侧的下标site,从最后一个元素开始存储
第三步:从两端开始遍历,当left<=right进入循环:将left指针对应的元素的平方数与right指针对应的元素的平方数进行比较,
1:当right指针对应的元素的平方数大于left指针对应的元素的平方数,将right指针对应的元素的平方数,替换掉新数组对应site位置的值,right指针向左移动,right -= 1
2:当left指针对应的元素的平方数大于等于right指针对应的元素的平方数,将left指针对应的元素的平方数,替换掉新数组对应site位置的值,left指针向右移动,left += 1
3:将新数组的site指针向左移动,site -= 1
第四步:返回新数组res
代码展示:
class Solution:
def sortedSquares(self, nums):
# 定义左右双指针
left, right = 0, len(nums)-1
# 定义一个新数组,从数组最后一个元素开始存储
res=[-1]*len(nums)
site = len(nums)-1
# 从两端开始遍历,判断左右指针在数组中对应的元素的平方的大小,将平方较大的替换新数组中site位置的值
while left <= right:
if nums[left]*nums[left] < nums[right]*nums[right]:
res[site] = nums[right] * nums[right]
right -= 1
else:
res[site] = nums[left] * nums[left]
left += 1
# 将site向左移动
site -= 1
return res