方法1:暴力排序
var sortedSquares = function (nums) {
const newArr = [];
nums.forEach((item, index) => {
newArr[index] = item * item;
});
newArr.sort((a, b) => {
return a - b;
});
return newArr;
};
console.log(sortedSquares([-7, -3, 2, 3, 11]));
方法2:双指针:两个指针指向数组的最左边和最右边,互相比较,大的放进数组,然后向左或者向右移动,接着继续比较,大的放进数组,直到两个指针指向同一个位置,这时候值是相等的,把那个值放进新数组索引为0的位置,index小于0了,退出循环。
var sortedSquares2 = function (nums) {
const newArr = [];
let begin = 0;
let end = nums.length - 1;
let index = end;
while (index >= 0) {
if (nums[begin] * nums[begin] < nums[end] * nums[end]) {
newArr[index] = nums[end] * nums[end];
end--;
} else {
newArr[index] = nums[begin] * nums[begin];
begin++;
}
index--;
}
return newArr;
};
console.log(sortedSquares2([-7, -3, 2, 3, 11]));
/*
最大元素一定在两边
两个指针逐步向中间合拢,然后慢慢给新数组赋值,赋值到最后,两个指针一定会指向同一个元素
这个元素就是新数组的arr[0],也就是最小值。
新数组也是下标从大到小更新。
就是肯定要比较的次数就是数组长度的次数。
比较的元素的平方比较大的,指针向左或者向右移动。
*/
//优化一下
var sortedSquares3 = function (nums) {
const newArr = [];
let begin = 0;
let end = nums.length - 1;
let index = end;
while (index >= 0) {
let left = nums[begin] * nums[begin];
let right = nums[end] * nums[end];
if (left < right) {
newArr[index--] = right;
end--;
} else {
//包括等于
newArr[index] = left;
begin++;
}
}
return newArr;
};
console.log(sortedSquares3([-7, -3, 2, 3, 11]));