leetCode
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
暴力解法:
思路:这种方法最简单,1.先求平方值。2.从小到大排序。
let nums = [-4,-1,0,3,10];
var sortedSquares = function(nums) {
let res = [];
for(let i = 0; i < nums.length; i++) {
res.push(nums[i] * nums[i]);
}
return res.sort((a,b) => a-b);
};
let r = sortedSquares(nums);
console.log(r);
双指针
从nums数组两端取值求平方,哪个值大,哪个值放在 result 的后面。
思路:
- 先初始化一个和 nums 一样的数组 result 用来存放结果值。
- 定义两个小标left 和 right 分别从 nums 数组的两端取值。
- 再定义一个 k ,默认值是数组长度 - 1(也就是指向result数组的最后一位)。
- 每次循环数组,取出 nums 数组的 左右两端的值,求平方。
- 然后再比较 两个值的大小。然后把较大的值放到 result 数组所在的k的位置。然后 k--,和对应的 right-- 和 left ++。
let nums = [-4,-1,0,3,10];
var sortedSquares = function(nums) {
let left = 0,
right = nums.length - 1;
let k = nums.length - 1;
let result = Array(nums.length).fill(0);
while(left <= right) {
let leftVal = nums[left] * nums[left];
let rightVal = nums[right] * nums[right];
if(leftVal <= rightVal) {
result[k--] = rightVal;
right--;
} else {
result[k--] = leftVal;
left++;
}
}
return result;
};
let r = sortedSquares(nums);
console.log(r);
参考资料:
github.com/youngyangya…