Algorithm/문제풀이

[Leetcode] Squares of a Sorted Array

lee308812 2021. 6. 26. 15:47

Given an integer array nums sorted in non-decreasing order, return an array of the squares of each number sorted in non-decreasing order.

 

Example 1:

Input: nums = [-4,-1,0,3,10]

Output: [0,1,9,16,100]

Explanation: After squaring, the array becomes [16,1,0,9,100]. After sorting, it becomes [0,1,9,16,100].

Example 2:

Input: nums = [-7,-3,2,3,11]

Output: [4,9,9,49,121]

 

Constraints:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums is sorted in non-decreasing order.

Follow up: Squaring each element and sorting the new array is very trivial, could you find an O(n) solution using a different approach?

 

[ 내 코드 ]

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result;
        int size = nums.size();
        result.reserve(size);


        int plusIdx = 0;
        while (plusIdx < size && nums[plusIdx] < 0) plusIdx++;

        int minusIdx = plusIdx - 1;

        while (minusIdx >= 0 && plusIdx >= 0 && plusIdx < size)
        {
            if (Abs(nums[minusIdx]) > Abs(nums[plusIdx]))
            {
                result.push_back(nums[plusIdx] * nums[plusIdx]);
                plusIdx++;
            }
            else
            {
                result.push_back(nums[minusIdx] * nums[minusIdx]);
                minusIdx--;
            }
        }

        while (minusIdx >= 0)
        {
            result.push_back(nums[minusIdx] * nums[minusIdx]);
            minusIdx--;
        }

        while (plusIdx < size && plusIdx >= 0)
        {
            result.push_back(nums[plusIdx] * nums[plusIdx]);
            plusIdx++;
        }

        return result;
    }

    int Abs(int num)
    {
        return num < 0 ? -num : num;
    }
};

 

[ 상위 점수 코드 ]

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        size_t size = nums.size();
        vector<int> result(size, 0);

        int left = 0;
        int right = size - 1;

        int cnt = 0;

        for (int i = size - 1; i >= 0; i--)
        {
            if (std::abs(nums[left]) > std::abs(nums[right]))
            {
                result[i] = (nums[left] * nums[left]);
                left++;
            }
            else
            {
                result[i] = (nums[right] * nums[right]);
                right--;
            }
        }

        return result;
    }
};

 

- 음수 시작지점, 양수 시작지점을 구한다음 절대값이 더 큰 녀석을 하나씩 result vector에 때려 넣는 방법으로 정답은 맞추었으나 생각보다는 코드가 복잡했다.

- 수행속도 상위 코드를 보니 훨씬 간단했는데 맨왼쪽, 맨오른쪽부터 서로 비교해 절대값이 큰값으로 뒤쪽부터 채워넣는 방식으로 하니 훨씬 코드가 간단했다.

 

- 뒤에서부터 때려넣는 방식을 생각해냈다면 좋았을 것 같다.

'Algorithm > 문제풀이' 카테고리의 다른 글

[Leetcode] Check If N and Its Double Exist ★★  (0) 2021.06.26
[Leetcode] Duplicate Zeros  (0) 2021.06.26
괄호  (0) 2021.02.19
[Brute Force] 캠프 준비  (0) 2020.03.05
[Brute Force] 두 스티커  (0) 2020.03.04