[977. Squares of a Sorted Array]

[(https://leetcode.cn/problems/squares-of-a-sorted-array/)

暴力解法

  • 对数组中每个元素平方后再排序

  • 代码如下:

    class Solution {public:    vector sortedSquares(vector& nums) {        for (int i = 0; i < nums.size(); i++) {            nums[i] *= nums[i];        }        sort(nums.begin(), nums.end());         return nums;    }};
  • 时间复杂度: O(n + nlogn)

    空间复杂度:O(1)

双指针

  • 根据题意,数组内元素是按non-decreasing排列。因此,最大数必然要么在左要么在右,不可能在中间

  • 故,我们设置 l = 0, r = nums.size() – 1 ,让i指向起始位置,而r指向最终位置,两边不断向中间移动

  • 再者,我们创建一个与nums大小相同的新数组,让i指向数组的最终位置

  • 若nums[ l ] * nums[ l ] < nums[ r ] * nums[ r ],result[ i– ] = nums[ r ] * nums[ r ]

    若nums[ l ] * nums[ l ] > nums[ r ] * nums[ r ],result[ i– ] = nums[ l ] * nums[ l ]

  • 代码如下:

class Solution {public:    vector sortedSquares(vector& nums) {        int i = nums.size() - 1;        vectorresult( i + 1 );        for( int l = 0, r = nums.size() - 1; l <= r; )//最后需处理一个元素,因此为l <= r        {            if( nums[l] * nums[l] < nums[r] * nums[r] )            {                result[i--] = nums[r] * nums[r];                --r;            }            else            {                result[i--] = nums[l] * nums[l];                ++l;            }        }        return result;    }};
  • 时间复杂度:O(n)

    空间复杂度:O(1)