首先我们使用暴力解法,直接遍历列表的每个元素平方后,在进行排序输出。但是时间复杂度 为O(nlogn)。
代码如下:
#普通暴力法
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
a = []
for i in nums:
a.append(i * i)
return sorted(a)
#暴力法+列表推导式
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted(x*x for x in nums)
这道题有说明让我们设计时间复杂度为O(n)的算法,所以这里我们使用双指针
双指针法
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,i指向起始位置,j指向终止位置。
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
如果A[i] * A[i] < A[j] * A[j]
那么result[k--] = A[j] * A[j];
。
如果A[i] * A[i] >= A[j] * A[j]
那么result[k--] = A[i] * A[i];
。
n = list(map(int, input().split(",")))
i = 0
j = len(n) - 1
k = len(n) - 1
result = [0] * len(n) # 提前定义一个和 n 长度相同的列表,初始化为0
while i <= j:
if n[i] ** 2 < n[j] ** 2:
result[k] = n[j] ** 2
j -= 1
else:
result[k] = n[i] ** 2
i += 1
k -= 1
print(result)
时间复杂度为O(n),其中这里用的是双指针的办法,这里初始化的指针有三个,i和j是在输入的数组上进行操作,而k是在最终输出的数组进行操作,其中k刚开始就在数组的末尾,然后经过判断后,最终的result数组是按照从小到大的顺序输出。