해당 포스팅은 릿코드 977번 Squares of a Sorted Array 풀이를 다룬다. 문제 링크
코드는 javascript로 작성하였으며 투포인터 문제이다.
Given an integer array nums sorted in non-decreasing order, return an array of the squares of each number sorted in non-decreasing order.
내림차순으로 정렬된 정수 배열이 주어지면 내림차순으로 정렬된 각 숫자의 제곱 배열을 반환하라.
문제의 키 포인트는 nums의 원소들이 음수를 포함한다는 것이다.
배열 nums는 0을 기준으로 왼쪽으로는 음수, 오른쪽으로는 양수이다. 즉 0을 기준으로 왼쪽 or 오른쪽으로 갈수록 제곱값이 커진다.
따라서 왼쪽과 오른쪽에 포인터(각각 s, e)를 두고 배열의 맨 마지막 원소부터 채워가자. 두 포인터의 제곱값 중 큰 값을 배열의 원소로 넣고 포인터를 땡겨주면 된다.
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
// 새로운 배열 생성
const sorted = new Array(nums.length).fill(0);
// 투포인터 생성
let s = 0;
let e = nums.length - 1;
// 현재 채워넣을 배열의 원소 idx
let pos = nums.length - 1;
// 투포인터를 이용해 내림차순으로 정렬된 각 숫자의 제곱 배열 생성
while (s <= e) {
const start = nums[s] ** 2;
const end = nums[e] ** 2;
if (start < end) {
sorted[pos] = end;
e -= 1;
}
else {
sorted[pos] = start;
s += 1;
}
pos -= 1;
}
return sorted;
};