专栏名称: YyyyyMC
目录
今天看啥  ›  专栏  ›  YyyyyMC

977 有序数组的平方

YyyyyMC  · 简书  ·  · 2019-06-09 14:34

文章预览

题目:

题目链接

给定一个按非递减顺序排序的整数数组 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节,这里就不展开了。

最后,感谢阅读 |ू・ω・` )

………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览