今天在刷算法题时,遇到这个做法。说实话,对于刚刚开始研究算法的我来说,确实被这个做法给惊呆了,果然大佬还是牛。所以就想着写出来分享给大家
一、题目
- 给你一个按 非递减顺序 排序的整数数组 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;
}
}
三、分析
- 首先,我们来分析一下手工过程。
- 其实这个做法很容易理解,但是要想到这种方法确实还是有点困难。这个题目的特点就是,该数组里面的数据已经排好序,如果,保存的全部是正数,我相信大家都会用很简单的方法做出来。但是如果出现负数就要注意数据的规律了。如果有负数,则平方之后最大的数字不是在最右侧就是在最左侧,根据这个规律,所以用上述做法很容易就实现了要求。