数组-977. 有序数组的平方

80 阅读1分钟

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 的后面。
思路:

  1. 先初始化一个和 nums 一样的数组 result 用来存放结果值。
  2. 定义两个小标left 和 right 分别从 nums 数组的两端取值。
  3. 再定义一个 k ,默认值是数组长度 - 1(也就是指向result数组的最后一位)。
  4. 每次循环数组,取出 nums 数组的 左右两端的值,求平方。
  5. 然后再比较 两个值的大小。然后把较大的值放到 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…