LeetCode练习跳转:. - 力扣(LeetCode)
这个题目给的数组时非递减的,要求给出所有元素都平方后的有序数组,很明显,数组会出现从负数到正数的情况,如果单纯平方一下不能实现数组的递增排序,下面给出两种解法:
1.暴力求解:
此处用到vector容器的两个用法即可解决:size()函数和sort()函数,一个用来确定循环的范围,一个用来直接排序,我们仅需写一行对元素的平放操作即可,暴力解法的时间复杂度为O(n+nlogn),其中n为循环的复杂度,由于sort函数通常使用快速排序算法,因此时间复杂度为nlogn,代码如下:
class Solution
{
public:
vector<int> sortedSquares(vector<int>& nums)
{
for(int i = 0;i< nums.size();i++)
{
nums[i]=nums[i]*nums[i];
}
sort(nums.begin(),nums.end());
return nums;
}
};
2.双指针法求解:
Carl佬:双指针风骚起来,也是无敌。(哈哈哈哈哈)
双指针求解这个问题中的双指针为left指针和right指针,说是指针实际就是一个索引的下标,只是起了指针的效果,left指向待扫描区域的最左侧,right指针指向待扫描区域的最右侧,两者的数据作比较,放到新定义的数组的最右侧,为什么这么设置规则呢,因为:
1.对于原非递减数组而言,数据平方后最大的数一定在两端,也就是通过每一次的比较可求到此时带扫描数组中的最大值。
2.每次都能求解到一个最大值,将其放到新数组的最后面,等到所有元素都扫描完毕,也就得到了一个平方后元素的非递减序列。
代码如下:
class Solution
{
public:
vector<int> sortedSquares(vector<int>& nums)
{
int left = 0;
int right = nums.size()-1;
int s = right;
vector<int> newnums(s+1);
while(left<=right)
{
if(nums[left]*nums[left]>= nums[right]*nums[right])
{
newnums[s]=nums[left]*nums[left];
left++;
s--;
}
else if(nums[left]*nums[left]< nums[right]*nums[right])
{
newnums[s]=nums[right]*nums[right];
right--;
s--;
}
}
return newnums;
}
};