題目描述:
給定一個按非遞減順序排列的整數陣列 nums(可能包含負數),返回每個數字的平方值組成的新陣列,且新陣列也按非遞減順序排列。
解題思路: 雙指標法:
由於陣列已排序,平方值最大的元素一定在兩端之一(最大的正數或絕對值最大的負數)。
lo = 0,右指標 hi = n - 1。|nums[lo]| 和 |nums[hi]|,將較大者的平方放入結果。時間複雜度:O(n) — 雙指標各移動一次,每個元素恰好處理一次。
空間複雜度:O(n) — 結果陣列(不計入的話為 O(1))。
1. Initialize result array of size n.
2. Set lo = 0, hi = n - 1, pos = n - 1.
3. While pos >= 0:
a. If |nums[lo]| >= |nums[hi]|:
result[pos] = nums[lo]^2, increment lo.
b. Else:
result[pos] = nums[hi]^2, decrement hi.
c. Decrement pos.
4. Return result.暴力法:O(n log n) 時間。先將所有元素平方,再排序。簡單直接但未利用輸入已排序的性質。
找零點 + 雙向合併:O(n) 時間。先找到正負數的分界點,然後用類似合併排序的方式從中間向兩端合併。邏輯等價於雙指標法但實作稍複雜。