Problem: 977. 有序数组的平方
思路
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,i指向起始位置,j指向终止位置。
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
如果 A[i] * A[i] < A[j] * A[j]
那么result[k--] = A[j] * A[j];
。
如果A[i] * A[i] >= A[j] * A[j]
那么result[k--] = A[i] * A[i];
。
如果执意要这么写,p1``p2
的++
和--
一定要写在后面。
1 2 3 4
| while(k < nums.size()) { if(nums[p1] * nums[p1] > nums[p2] * nums[p2]) res[k--] = nums[p1] * nums[p1++]; else {res[k--] = nums[p2] * nums[p2--];} }
|
脑瘫的错误
几乎没有错误,除了left++;
写成left--;
外
不记得常用的排序算法了(C++自带的)
vector容器有点忘记
复杂度
$O(n + nlog(n))$ $O(n)$
$O(n)$
Code
暴力算法
1 2 3 4 5 6 7 8 9 10
| 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; } };
|
双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public: vector<int> sortedSquares(vector<int>& nums) { int left = 0,right = nums.size() - 1; int reprt = right; vector<int> result(nums.size(),0);
while(left<=right) { if(nums[left] * nums[left] < nums[right] * nums[right]) { result[reprt--] = nums[right] * nums[right]; right--; } else { result[reprt--] = nums[left] * nums[left]; left++; } } return result; } };
|