解析
平方后的数组是分段有序的,如果有负数的话是负数从大到小,正数部分从小到大
代码
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int index = 0;for(int i = 0; i < nums.size(); i++){if(nums[i] < 0){index = i + 1;}nums[i] = nums[i] * nums[i];}vector<int> newNums;// newNums.push_back(index);int i;for(i = index - 1; i >= 0 && index < nums.size(); ){if(nums[i] < nums[index]){newNums.push_back(nums[i]);i--;}else{newNums.push_back(nums[index]);index++;}}if(index == nums.size()){for(int j = i; j >= 0; j--){newNums.push_back(nums[j]); } }else if(i < 0){for(int j = index; j < nums.size(); j++){newNums.push_back(nums[j]);} }return newNums;}
};
使用双指针除了从中间向两边遍历,还可以从两边向中间遍历
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int index = 0;vector<int> newNums;for(int i = 0; i < nums.size(); i++){newNums.push_back(0);}int k = nums.size() - 1;for(int i = 0, j = nums.size() - 1; i <= j; ){if(nums[i] * nums[i] < nums[j] * nums[j]){newNums[k] = nums[j] * nums[j];k--;j--;}else{newNums[k] = nums[i] * nums[i];k--;i++;}}return newNums;}
};