题目描述:
给你一个按 非递减顺序 排序的整数数组nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
解题思路:
暴力解法:
将数组中每个元素都取其平方后,在对数组进行全部排序。这种解法最为简单,但是题目中的非递减排序的整数数组这个条件完全没有使用。
代码实现:
int left = 0;
for(int right = 0 ;right != nums.size();right++)
{
nums[left]=nums[right]*nums[right];
left++;
}
sort(nums.begin(),nums.end());
return nums;
}
双指针解法:
已知数组是有序的整数数组,当数组中的元素均为正整数时,对其取平方,数组中元素顺序不会发生改变;当数组中存在负整数元素时,最小的负整数元素的平方存在大于最大整数的元素平方的可能。
此时,我们设指针left指向数组的首端,指针right指向数组的尾端;使用双指针由数组的首位两端开始遍历同时对数组元素取其平方值。将较大的一个放入新数组的尾部。依次进行如上操作即可。
代码实现:
int len=nums.size();
vector<int> target(len);
int left=0;
int right=len-1;
for(int i = len-1;left<=right;--i)
{
//Compare(left,right,nums);
if((nums[right]*nums[right])>(nums[left]*nums[left]))
{
target[i]=nums[right]*nums[right];
--right;
}else
{
target[i] = nums[left]*nums[left];
++left;
}
// --i;
}
return target;
}