双指针定义
左指针指向原数组起始位置
右指针指向原数组终止位置
题目思考
- 原题给出数组是有序的, 负数平方之后可能成为最大数,所以数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
- 创建结果新数组,逐一比较原数组两端的平方值,大的值丢入新数组末尾,以从大到小顺序排列。
- 不能取比较原数组两端的平方值中的较小值放入新数组开头从小到大排序,这样只能取出当前两个平方值中较小的那一个,而不是整个数组平方最小值。
js题解示例
var sortedSquares = function (nums) {
let right = nums.length - 1//右指针
let result = new Array(nums.length);//创建接收结果的新数组
let index = result.length - 1//新数组指针
for (let left = 0; left <= right;) {//左指针
let leftRes = nums[left] * nums[left]
let rightRes = nums[right] * nums[right]
if (leftRes > rightRes) {//比较两端的值
result[index] = leftRes//大的就放进新数组的末尾
left++
} else {
result[index] = rightRes
right--
}
index--
}
return result
};