解題說明
Shuffle the Array
題目描述:
給定一個陣列 nums,其包含 2n 個元素,格式為 [x1, x2, ..., xn, y1, y2, ..., yn]。回傳以 [x1, y1, x2, y2, ..., xn, yn] 格式排列的陣列。
解題思路:
直接模擬即可。建立一個新陣列,依序交替放入前半部和後半部的元素。對於索引 i(0 到 n-1),結果陣列的位置 2i 放 nums[i],位置 2i+1 放 nums[n+i]。
C++ 解法
複雜度分析
時間複雜度:O(n) — 遍歷一次,每步 O(1)。
空間複雜度:O(n) — 需要一個新陣列存放結果(若不計輸出空間則 O(1))。
虛擬碼
1. Create result array of size 2n 2. For i from 0 to n-1: a. result[2*i] = nums[i] b. result[2*i + 1] = nums[n + i] 3. Return result
其他解法
原地交織(O(1) 額外空間):利用每個元素值不超過 1000 的限制,將兩個值編碼到同一個整數中(例如用乘以 1001 的方式),然後再次遍歷解碼。時間 O(n),空間 O(1),但實作較不直觀。
遞迴分治:將陣列分成更小的部分,遞迴交織。時間 O(n log n),沒有優勢,純粹練習遞迴思維。
延伸思考
- 如何在不使用額外陣列的情況下原地完成交織(O(1) 空間)?
- 若要反向操作(將交織陣列還原為原始格式),如何實現?
- 若陣列長度不是偶數(前半部和後半部長度不同),如何處理?