题目:
题目链接
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 1:
输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
示例 2:
输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A 已按非递减顺序排序。
解题思路:
先求对应元素的平方并替换,再调用排序函数排序,这里排序函数直接就用C++标准库里的sort()函数在代码上是想到方便的,但效率上就有待商榷了,这里我们先AC一下
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
for(int i = 0; i < A.size(); i++){
A[i] *= A[i]; //对每个元素求平方
}
sort(A.begin(), A.end()); //排序
return A;
}
};
执行用时 : 156 ms, 在Squares of a Sorted Array的C++提交中击败了80.06% 的用户
内存消耗 : 13.7 MB, 在Squares of a Sorted Array的C++提交中击败了84.13% 的用户
这里可以看到sort()函数的效率还是可以的,既然碰到了sort()函数,那我们就来探究一下。
sort()函数是c++标准库函数之一,包含在头文件<algorithm>中,排序方法是类似于快排的方法,时间复杂度为O(nlog2n),执行效率较高!
包含三个参数,第一个是要排序的数组的起始地址,第二个是结束的地址(最后一位要排序的地址的下一地址),对于本题中的容器来说,.end()函数不用经过处理即可直接适用,第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
可以看到在代码精简的基础上,时间空间效率都能勉强接受,提升空间不大。
如果想要进行优化,这里提出一些个人观点,可以对所有数据取绝对值再求平方,对求平方循环进行二次循环展开(数据必然是二位以上的,不然排序没有任何意义,所以在数据未确定的情况下只能进行二次循环展开),在时间效率上应该会略有提升。
上述的二次循环展开,具体可见《CSAPP》第5章第4节,这里就不展开了。
最后,感谢阅读 |ू・ω・` )