详细解析:请看Carl老师的讲解
977. 有序数组的平方 | 点击查看力扣对应题目
解题思路
第一反应是用双指针,一个指向数组头,一个指向数组尾,两数比较绝对值大小,小的进入新数组。然后发现得出的新数组不是有序的,应该把绝对值大的数据放入新数组中。
整理后思路如下:
设两个指针,左右指针分别指向起始位置和终止位置;
然后重新使用一个数组用来存放结果,索引 k 指向 newnums 数组的终止位置;
比较绝对值大小用平方和来比较,平方数大的放入新数组中;
如果平方数大的是右指针,右指针向左移一位,左指针不变;
否则,左指针向右移一位,右指针不变。
代码
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let l = 0; //左指针指向起始位置
let r = nums.length - 1; // 右指针指向末尾位置
let newnums = []; //新数组
let k = nums.length - 1; //新数组指针从右往左依次放入数据
while (l <= r){
if(nums[l]*nums[l] < nums[r]*nums[r]){ //当左绝对值小于右绝对值时
newnums[k--] = nums[r]*nums[r]; //将右指针指向的数放入新数组
r--; //右指针往左移
}
else {
newnums[k--] = nums[l]*nums[l];
l++;
}
}
return newnums;
};
总结
这一题和昨天的双指针有点不同,昨天的双指针是同方向移动的,今天的比较好理解,思路理清了就能做出来了。
今天的事情比较多,明天补上剩下两题。