难度:⭐
题目描述:
给定一个按非递减顺序排序的整数数组 A
,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例1:
1 | 输入:[-4,-1,0,3,10] |
示例2:
1 | 输入:[-7,-3,2,3,11] |
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A
已按非递减顺序排序。
解题过程:
思路:
遍历每一行,然后对每一行中的元素翻转交换元素的值(swap函数),再反转元素的值,注意特殊情况,矩阵行数为奇数时中间元素要特殊处理反转一次。
c++代码:(执行用时136ms,击败27.35%,内存消耗24.9M,击败41.18%)
1 | class Solution { |
官方题解:
方法一: 模拟
我们可以不使用额外的(非常数)空间来完成翻转和反转操作。对于 A[i][j]
,我们将它和 A[i][c - j - 1]
进行交换(即翻转),其中 c
是数组 A
的列数。在交换的同时,我们可以将这两个数进行反转。
Java代码:
1 | class Solution { |
复杂度分析
- 时间复杂度:$O(M*N)$,其中 $M$ 和 $N$ 分别为数组
A
的行数和列数。 - 空间复杂度:$O(1)$。
总结:
官方题解和我的思路一样,不过对于特殊情况比我处理的好,也不算特殊情况吧,只是我自己把它当作特殊情况处理了,主要在于我使用了vector容器中的swap成员函数来交换两个元素,这样必须反转后覆盖原值,对于奇数行数矩阵的每行中间元素反转了两次,而采用tmp辅助变量来进行交换两个元素值不涉及到覆盖问题。其实就是太执着于STL模板库中的成员函数了,自己实现交换元素的功能也挺好,相当于对源码根据实际情况进行了改进,这样才能更灵活地处理问题。