持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
一、题目描述:
给你一个按 非递减顺序 排序的整数数组 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 <= 10^4
- -10^4 <= nums[i] <= 10^4
- nums 已按 非递减顺序 排序
进阶:
请你设计时间复杂度为 O(n) 的算法解决本问题
二、思路分析:
因为数组已经按照升序排序好了 如果数组nums中all非负数 将每个数平方后 数组仍升序 若均为负数,平方后,数组会是降序 所以,需寻找数组nums中负数与非负数的分界线---neg,【归并排序】 即nums[0]到nums[neg]为负数,nums[neg+1]到nums[n-1]为非负数 平方后,nums[0]到nums[neg]单调递减,nums[neg+1]到nums[n-1]单调递增 get two sorted 数组 归并排序: 使用两个指针分别指向位置neg neg+1,每次比较两个指针对应的数,选择较小的那个放入答案并移动指针。 when 某一指针移至边界时,将另一指针还未遍历到的数依次放入答案。
三、AC 代码:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n=len(nums)
negtive=-1
for i,num in enumerate(nums):
if num<0:
negtive = i
else:
break
ans=list()
i,j =negtive,negtive+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
四、参考: