题目:
已知一个有序数组,返回所有元素平方之后的依然有序的数组(有负数)
-5 | 1 | 2 | 3 |
法一:平方后重新排序
法二:双指针
观察:平方后的最大元素一定在两边,即-5或3;那么可以用两个指针逐步向中间靠拢的方式得到一个由大到小的数组,在更新数组的时候下标由大到小更新即可获得从小到大排列的数组。
代码实现(自然语言,不可运行)
vetor<int> result //定义新数组装平方之后的新元素
k = nums.size - 1 //定义索引下标 确保最后的数组是由小到大排列
for(i = 0, j = nums.size-1; i <= j; ){ //有等于是要确保i=j时的数据也被计算
//i++,j--的操作不写在循环里,因为有对应元素
if(nums[i] * nums[i] > nums[j] *nums[i] ) //取i对应的元素
{ result[k] = nums[i] * nums[i] ;
k--;
i++; }
else{
result[k] = nums[j] * nums[j] ;
k--;
j--;
}
return result;
题目链接
可运行代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n);
for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
ans[pos] = nums[i] * nums[i];
++i;
}
else {
ans[pos] = nums[j] * nums[j];
--j;
}
--pos;
}
return ans;
}
};