- 有序数组的平方
题目链接
思路
先把负数变正,再将数组排序,最后平方。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i = 0;i<nums.size();i++){
if(nums[i]<0){
nums[i] = -nums[i];
}
}
sort(nums.begin(),nums.end());
for(int i = 0;i<nums.size();i++){
nums[i] = nums[i]*nums[i];
}
return nums;
}
};
知识点
vector自身自带排序
/*1,调用 sort() 后调用 reverse()
reverse() 的作用是反转元素,也就是说将原来的第一个放置于新容器的最后一位,第二位放置于倒数第二位,以此类推。
并不是调用 reverse() 就直接降序排列了,切记!!!*/
sort(v.begin(),v.end());//这样即可实现 v 各元素的升序排列(sort默认升序)
reverse(v.begin(),v.end());
//2,自定义比较函数 comp() 定义放在 main() 外
bool comp(const int & a,const int & b)
{
return a > b;
}
int main()
{
...
之前那一大堆
...
sort(v.begin(),v.end(),comp); //系统默认比较函数返回:return a < b;
}
网上题解
\\双指针法
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int k = A.size() - 1;
vector<int> result(A.size(), 0);
for (int i = 0, j = A.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后要处理两个元素
if (A[i] * A[i] < A[j] * A[j]) {
result[k--] = A[j] * A[j];
j--;
}
else {
result[k--] = A[i] * A[i];
i++;
}
}
return result;
}
};