Easy草稿★★★★★O(n) 時間 · O(n) 空間
ArrayTwo PointersSorting
Patterns↔️ 雙指針🔢 排序後處理
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

977Squares of a Sorted ArrayBinary SearchEasyBinary Search

給定一個按非遞減順序排列的整數陣列 nums,回傳每個數字平方後的結果,同樣按非遞減順序排列。

Example:

Input: nums = [-4,-1,0,3,10] Output: [0,1,9,16,100]

Intuition

TIP

陣列兩端的絕對值最大,用雙指標從兩端往中間靠攏,由大到小填入結果陣列。

Approaches

1. Sorting — O(n log n) / O(n)
  • Idea: 先全部平方,再排序
  • Time: O(n log n)
  • Space: O(n)(排序用的空間)
Sorting Code
class Solution {
    fun sortedSquares(nums: IntArray): IntArray {
        return nums.map { it * it }.sorted().toIntArray()
    }
}
⭐ 2. Two Pointers — O(n) / O(n)
  • Idea: 左右兩端指標,比較絕對值大小,從結果陣列尾端往前填入
  • Time: O(n)
  • Space: O(n)(結果陣列)
class Solution {
    fun sortedSquares(nums: IntArray): IntArray {
        val n = nums.size
        val result = IntArray(n)
        var left = 0
        var right = n - 1
        var pos = n - 1
        while (left <= right) {
            val leftSq = nums[left] * nums[left]
            val rightSq = nums[right] * nums[right]
            if (leftSq > rightSq) {
                result[pos] = leftSq
                left++
            } else {
                result[pos] = rightSq
                right--
            }
            pos--
        }
        return result
    }
}

🔑 Takeaways