算法笔记 -- 977. 有序数组的平方

82 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

977. 有序数组的平方 - 力扣(LeetCode)

给你一个按 非递减顺序 排序的整数数组 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

四、参考:

977. 有序数组的平方 双指针 两端向中间遍历顺序 - 有序数组的平方 - 力扣(LeetCode)