LeetCode:有序数组的平方

本文探讨了一种解决LeetCode上的排序数组平方问题的方法,通过双指针技术,避免了额外的排序操作,实现了高效的时间复杂度。在处理正负数混合的数组时,将数组分为正负两部分,分别从两端开始计算平方并插入结果数组。同时,注意到在进行简单计算时,避免使用Java的Math.pow()函数,直接计算平方能显著提升性能。此外,文章还对比了预先计算平方值对时间效率的影响。
摘要由CSDN通过智能技术生成

题目:

给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

示例 1:

输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]

来源:力扣(LeetCode)

解:

这道题如果直接求解再直接原数组排序,倒是节省空间,但是再快也要O(nlogn),所以这里不采用。

一个有序数组如果全负全正,那么我们就可以获得平方后的有序数组。所以我们把数组看成两部分,前半部分为负数组,后半部分为正数组(含0),采用双指针方法从边界(正负端都是从大到小)遍历平方,然后比较大小插入辅助数组,就可获得一个“正负双数组”拼接而成的平方数组。

class Solution {
    public int[] sortedSquares(int[] A) {
        int[] rs=new int[A.length];
        int s=0,e=A.length-1,id=A.length-1;
        while(s<=e){
            if((A[s]*A[s])>=(A[e]*A[e])){
                rs[id--]=A[s]*A[s++];
            }else{
                rs[id--]=A[e]*A[e--];
            }
        }
        return rs;
    }
}

这里顺便提一下,不要总是习惯去调用Java工具类,我在算平方时调用了java.lang.Math.pow(a,b),结果时间上为3ms,如果直接计算时间为1ms,所以简单运算时自己写一下就好,调函数时可能会增加系统不必要的开销。

出于好奇,如果是提前算平方(多遍历一次),节省计算量,时间会是多少?结果还是1ms,LeetCode只支持到ms层,所以要快很多才能到达0ms。当然有兴趣可以自己提高数据量测速。

class Solution {
    public int[] sortedSquares(int[] A) {
        int[] rs=new int[A.length];
        for(int i=0;i<A.length;i++){
            A[i]*=A[i];
        }
        int s=0,e=A.length-1,id=A.length-1;
        while(s<=e){
            if(A[s]>=A[e]){
                rs[id--]=A[s++];
            }else{
                rs[id--]=A[e--];
            }
        }
        return rs;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值