977有序数组的平方
题目链接
ttps://leetcode.cn/problems/squares-of-a-sorted-array/
题目
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
输入输出
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
代码
方法一:直接调用函数排序
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++)
{
nums[i] = nums[i] * nums[i];
}
/*for (int i = 0; i < nums.size()-1; i++)
{
for (int j = 0; j < nums.size()-i-1; j++)
{
if (nums[j] > nums[j + 1])
{
int temp;
temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}*/
sort(nums.begin(), nums.end());
return nums;
}
};
方法二:双指针法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;//代表下标的。
vector<int> ret(nums.size(), 0);//对ret数组进行初始化为nums的大小,并且每个数字都为0.
int j = 0, i = k;//一个指向头,一个指向尾,每次把两者比较的数放入新数组中。
for (; j <= i;)
{
if (nums[j] * nums[j] >= nums[i] * nums[i])
{
ret[k--] = nums[j] * nums[j];
j++;
}
else
{
ret[k--] = nums[i] * nums[i];
i--;
}
}
return ret;
}
};
解析
第一种方法就是先对每个数字进行平方,然后再调用函数sort进行排序。
第二种方法:用空间换时间,第一种方法的时间复杂度为O(n^2),用快速排序的话时间复杂度可以达到O(nlogn),但是双指针的方法可以让时间复杂度化简为O(n)。
总结
方法二提供的思路感觉非常重要,用空间换时间。