LeetCode题解——有序数组的平方


今天在刷算法题时,遇到这个做法。说实话,对于刚刚开始研究算法的我来说,确实被这个做法给惊呆了,果然大佬还是牛。所以就想着写出来分享给大家

一、题目

  • 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
  • 示例:
    输入:nums = [-4,-1,0,3,10]
    输出:[0,1,9,16,100]
    解释:平方后,数组变为 [16,1,0,9,100]
    排序后,数组变为 [0,1,9,16,100]
  • 我见到这道题时的想法(虽然我的想法和大神的比起来就很弱,但是还是想说一下,方便一些刚刚开始学习算法同学的理解):首先,遍历数组对每个一个数据进行平方运算,然后保存到原位置。其次,使用一些排序算法进行重新排序。例如:冒泡、希尔、插入、快排等等。

二、大佬的做法

  • 首先我先把代码分享给大家,然后再对其进行解释,来帮助大家理解。
class Solution {
    public int[] sortedSquares(int[] A) {
        int start = 0;
        int end = A.length;
        int i = end - 1;
        int[] nums = new int[end--];
        
        while (i >= 0) {
            nums[i--] = A[start]*A[start] >= A[end]*A[end] ? A[start]*A[start++] : A[end]*A[end--];
        }
        return nums;
    }
}

三、分析

  • 首先,我们来分析一下手工过程。
    在这里插入图片描述
  • 其实这个做法很容易理解,但是要想到这种方法确实还是有点困难。这个题目的特点就是,该数组里面的数据已经排好序,如果,保存的全部是正数,我相信大家都会用很简单的方法做出来。但是如果出现负数就要注意数据的规律了。如果有负数,则平方之后最大的数字不是在最右侧就是在最左侧,根据这个规律,所以用上述做法很容易就实现了要求。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值