问题描述:
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))
声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。