https://leetcode.cn/problems/squares-of-a-sorted-array/description/

开始看到题想的是直接使用暴力排序算法来求解,但想了想好像浪费了数组本身有序的特性,时间复杂度也会超过O(n)。

再看到这题是属于双指针题,就想到能不能头尾各置一个指针,共同向中间遍历(因为平方后最大值一定是两端中的一个),写了写发现可行。由于题目不要求原地修改所以将结果值放在一个新的vector中就能实现O(n)的时间复杂度

<aside> 💡

思路重点:平方后的最大值一定位于头尾中的一端

</aside>

// 双指针法,初始一个指向头一个指向尾,一同向中间遍历,
// 将较大值移到新数组尾部,直到两指针相遇
vector<int> sortedSquares(vector<int>& nums) {
	int front = 0, back = nums.size() - 1;        // 头尾指针

	vector<int> res(nums.size(), 0);
	int backR = res.size() - 1;			// 从后向前更新res

	// 若条件为 < 会漏掉最后一个元素
	while (front <= back) {
    // 选个大的放到新数组的尾部
		if (abs(nums[front]) > abs(nums[back])) 
			res[backR--] = pow(nums[front++], 2);
		else 
			res[backR--] = pow(nums[back--], 2);
	}
	return res;
}