977. 有序数组的平方
描述:
-
输入一个有序数组(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)。除了存储答案的数组以外,我们只需要维护常量空间。