#LeetCode,977.有序数组的平方(双指针)

给你一个按 非递减顺序 排序的整数数组 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 <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序

进阶:请你设计时间复杂度为 O(n) 的算法解决本问题

暴力解决:

def sortedSquares(nums):
    """

    :param nums:
    """
    lst = list()
    for i in nums:
        temp = i**2
        lst.append(temp)
    return sorted(lst)


a = [-4, -1, 0, 3, 10]
print(sortedSquares(a))
[0, 1, 9, 16, 100]

或者

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
            lst = list()
            for i in nums:
                temp = i**2
                lst.append(temp)
            return sorted(lst)

这种做法时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),更快的做法是利用双指针,通过建立左右两个指针,将两个指针所指的值中绝对值大的放到后面,然后接着比较。
利用题目中数组是有序的这个条件,先找到负数与正数的分界值,分别定义两个指针从分界处开始比较两指针所指的值的平方,将小的插入新的数组中。直到一方索引完,另一方就直接按顺序插入数组。

def sortedSquares(nums):
    """

    :param nums:
    :return:
    """
    n = len(nums)
    poi = -1
    for i, num in enumerate(nums):
        if num < 0:
            poi = i
        else:
            break

    li = list()
    i, j = poi, poi+1
    while i >= 0 or j < n:
        if i < 0:
            li.append(nums[j]**2)
            j += 1
        elif j == n:
            li.append(nums[i]**2)
            i -= 1
        elif nums[i]**2 < nums[j]**2:
            li.append(nums[i]**2)
            i -= 1
        else:
            li.append(nums[j]**2)
            j += 1
    return li


ans = [-4, -1, 0, 3, 10]
print(sortedSquares(ans))
[0, 1, 9, 16, 100]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值