平方组成的新数组

题目:

给你一个按非递减顺序排序的整数数组 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

思路:每个数平方之后,排个序

  1. 过于简单

复杂度:

  • 时间复杂度:O(n+nlogn)
  • 空间复杂度:

代码:

1
2
3
4
5
6
7
8
9
10
std::vector<int> test::solution(std::vector<int> &nums)
{
std::vector<int> result(nums.size());
for (int i = 0; i < nums.size(); i++)
{
result[i] = nums[i]*nums[i];
}
sort(result.begin(),result.end());
return result;
}

解法2–双指针法

思路:本来就是有序的数组,由于负数平方之后可能会改变数组的顺序,所以重点关注负数
数组平方的最大值出现在数组的两端,左或者右,不可能是中间。所以可以考虑双指针法,left和right

  1. 定义新数组,用来存储结果,注意初始化大小,否则容易出现溢出错误
  2. 判断nums[left]*nums[left]nums[right]*nums[right]大小,以便赋值给result[i]
  3. 如果nums[left]*nums[left] > nums[right]*nums[right] 那么 result[i] = nums[left]*nums[left]
  4. 如果nums[left]*nums[left] < nums[right]*nums[right] 那么 result[i] = nums[right]*nums[right]
  5. 初始值i = nums.size()-1,方便从后往前填充

复杂度:

  • 时间复杂度:o(n)
  • 空间复杂度:

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::vector<int> test::solution(std::vector<int> &nums)
{
std::vector<int> result(nums.size());
int left = 0,right = nums.size()-1;
//从后往前填充
//i>=0
for(int i = nums.size()-1;i>=0;i--)
{
if(nums[left]*nums[left] > nums[right]*nums[right])
{
result[i] = nums[left]*nums[left];
left++;
}
else{
result[i] = nums[right]*nums[right];
right--;
}
}
return result;
}