LeetCode:977. Squares of a Sorted Array - Python

本文介绍了一个LeetCode上的经典算法题——有序数组的平方。题目要求输入一个非递减排序的整数数组,返回一个同样非递减排序的数组,其中每个元素是原数组中对应元素的平方。文章详细解析了如何通过双指针技术在O(N)的时间复杂度内解决该问题,避免了常规排序方法的O(NlogN)复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

977. Squares of a Sorted Array

问题描述:

Given an array of integers A sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.

Example 1:

Input: [-4,-1,0,3,10]
Output: [0,1,9,16,100]
Example 2:

Input: [-7,-3,2,3,11]
Output: [4,9,9,49,121]

Note:

1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A is sorted in non-decreasing order.

问题分析:

这个题目很简单,如果直接用排序的话,python也就一两代码的事情,但是时间复杂度一般最少为O(NlogN),很显然题目希望的时间复杂度是O(N)。如果没有负数的话,直接扫描一边就可以了。如果存在负数的情况那?

(1)因为要考虑负数的情况,所以,可以想到的方法是两路归并

(2)先找到了列表的正负值的分界点。

(3)从分界点中,设置两个指针,一个向前处理,一个向后处理,并相互比较,归并到一个列表里。

(4)其中要注意,列表的边界等问题。

Python3实现:

class Solution():
    def sortedSquares(self, A):
        N = len(A)
        j = 0  # i, j,表示两个指针,分别从正负界限,指向负数部分,和正数部分
        while j < N and A[j] < 0:
            j += 1
        i = j - 1

        res = []
        while 0 <= i and j < N:  # 归并操作, 谁的平方小,谁先输出
            if A[i]**2 < A[j]**2:
                res.append(A[i]**2)
                i -= 1
            else:
                res.append(A[j]**2)
                j += 1

        while i >= 0:  # 如果,负数部分没有输出完,则直接输出
            res.append(A[i]**2)
            i -= 1
        while j < N:  # 如果,正数部分没有输出完,则直接输出
            res.append(A[j]**2)
            j += 1

        return res


if __name__ == '__main__':
    solu = Solution()
    A = [4, 5, 0, -2, -3, 1]
    print(solu.sortedSquares(A))

声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

题目链接参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值