刷LeetCode100道-Day04

977.有序数组的平方

题目

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

    输入:nums = [-4,-1,0,3,10]
    输出:[0,1,9,16,100]
    解释:平方后,数组变为 [16,1,0,9,100]
    排序后,数组变为 [0,1,9,16,100]

示例 2:

    输入:nums = [-7,-3,2,3,11]
    输出:[4,9,9,49,121]

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

进阶:

  • 请你设计时间复杂度为 O(n) 的算法解决本问题

想法

看到题目最简单粗暴的方法肯定是遍历数组求平方然后排序,哈哈这么写就没有锻炼算法的必要了

[-4,-1,0,3,10]
[-10,-1,0,3,4]

因为是先平方,所以负数的平方之后也为正数,那么最大的数肯定是在数组的最左侧或者最右侧,那么就可以用双指针

实现

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let arr = []
    let l = 0, r = nums.length - 1;
    while(l <= r){
        let lResult = Math.pow(nums[l],2)
        let rResult = Math.pow(nums[r],2)
        if(lResult > rResult){
            arr.unshift(lResult)
            l++
        }else if(lResult < rResult){
            arr.unshift(rResult)
            r --;
        }else{
            if (l === r) {
                arr.unshift(lResult);
            } else {
                arr.unshift(lResult, rResult); 
            }
            l++;
            r--;
        }
    }
    return arr
};

在题解里面看到一个更优雅的写法,分享如下

var sortedSquares = function(nums) {
    const n = nums.length;
    const ans = Array(n);
    let i = 0, j = n - 1;
    for (let p = n - 1; p >= 0; p--) {
        const x = nums[i] * nums[i];
        const y = nums[j] * nums[j];
        if (x > y) {
            ans[p] = x;
            i++;
        } else {
            ans[p] = y;
            j--;
        }
    }
    return ans;
};

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容