class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int l, r=0;
std::vector<int> sortedSq;
sortedSq.reserve(nums.size());
while( r < nums.size() && nums[r] < 0) // find first positive number
++r;
l = r-1;
while(l > -1 && r < nums.size()) // while in index range
{
if(-1*nums[l] < nums[r]) // multiplied by -1 since nums[l] shall always be negative
{
sortedSq.push_back(nums[l] * nums[l]);
l--;
}
else
{
sortedSq.push_back(nums[r] * nums[r]);
r++;
}
}
// now copy over the remaining numbers
// for example, say l reached < 0 but r still had some numbers remaining and vice-versa
// only one of the following for loop will be executed based on reason for while loop exit
for(; l > -1; l--)
sortedSq.push_back(nums[l] * nums[l]);
for(; r < nums.size(); r++)
sortedSq.push_back(nums[r] * nums[r]);
return sortedSq;
}
};