977. 有序数组的平方

148 阅读2分钟

977. 有序数组的平方

LeetCode

描述:

  • 输入一个有序数组(vector<int>), 将其每一个元素进行平方运算, 之后作为新数组进行输出, 新数组也应是有序的

  • 示例:

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

思路:

  • 第一个想法就是暴力法, 也就是挨个取平方后进行排序, 然后返回, 这个方法的时间复杂度为O(n+nlongn), 其中遍历数组的复杂度为O(n), C++内置的sort排序函数的复杂度为O(nlogn)

  • 很明显这个方法不够ok, 题目告诉我们, 传入的数组本身就是一个有序数组, 但是考虑到负数的情况, 有负数的平方大于正数的情况, 但是我们可以知道, 最大的数肯定是在数组的两头, 而最小的数, 就在中部, 可以通过双指针法, 两个指针指向数组的两端, 进行平方数的判断, 来直接获取有序的平方数的数列.

  • 根据上述思路, 结合代码实现可以很好的了解这个题的解法.

代码:

  • 代码中对索引值的++, --操作单独拿了出来, 为了方便理解, 也可以写在表达式里面.
/*
 * @lc app=leetcode.cn id=977 lang=cpp
 *
 * [977] 有序数组的平方
 */

// @lc code=start
class Solution
{
public:
  vector<int> sortedSquares(vector<int> &nums)
  {

    vector<int> val(nums.size(), 0);

    int n = val.size() - 1;

    for (int l = 0, r = nums.size() - 1; l <= r;)
    {
      if (nums[l] * nums[l] > nums[r] * nums[r])
      {
        val[n] = nums[l] * nums[l];
        n--;
        l++;
      }
      else if (nums[l] * nums[l] <= nums[r] * nums[r])
      {
        val[n] = nums[r] * nums[r];
        n--;
        r--;
      }
    }

    return val;
  }
};

时间复杂度:O(n),其中 n是数组 nums 的长度。

空间复杂度:O(1)。除了存储答案的数组以外,我们只需要维护常量空间。