📘 題目敘述
給你一個陣列 nums,它共有 2n 個元素,格式為:
[x1, x2, ..., xn, y1, y2, ..., yn]
請回傳重新排列後的陣列:
[x1, y1, x2, y2, ..., xn, yn]
條件限制
1 <= n <= 500nums.length == 2n1 <= nums[i] <= 10^3
🧠 解題思路
這題的重點很直接:
題目已經把原本陣列切成兩半了:
- 前半段是
x1 ~ xn - 後半段是
y1 ~ yn
而我要做的事情,就是把這兩半交錯放進答案陣列裡:
- 第
0個位置放x1 - 第
1個位置放y1 - 第
2個位置放x2 - 第
3個位置放y2
一路這樣排下去。
所以我用一個迴圈跑 i = 0 ~ n-1,每次處理一組:
nums[i]是第i+1個xnums[i+n]是第i+1個y
然後把它們放到答案陣列的:
ans[2*i]ans[2*i+1]
也就是說,這題的核心就是:
前半段和後半段各取一個元素,依序交錯放進答案陣列。
所有變數
n:前半段x的數量,也是後半段y的數量ans:答案陣列,大小是2 * n
🪜 主要流程步驟
1. 先建立大小為 2n 的答案陣列
vector<int> ans(2 * n);
因為最後答案會有 2n 個位置,所以先直接開好。
這樣後面就可以用 index 直接把對應位置填進去。
2. 跑一圈 i = 0 ~ n - 1,每次處理一組 x 和 y
for (int i = 0; i < n; i++) {
這裡每一個 i 都代表:
nums[i]是一個xnums[i + n]是和它對應的y
因為前半段長度就是 n,所以後半段第一個元素的位置就是 n。
3. 把 x 放到偶數位置,把 y 放到下一個奇數位置
ans[2 * i] = nums[i];
ans[2 * i + 1] = nums[i + n];
這一段是整題的核心。
對於第 i 組資料:
nums[i]放到ans[2*i]nums[i+n]放到ans[2*i+1]
例如:
i = 0ans[0] = x1ans[1] = y1
i = 1ans[2] = x2ans[3] = y2
所以最後整個答案就會自然變成:
[x1, y1, x2, y2, ..., xn, yn]
4. 回傳答案陣列
return ans;
當整個迴圈跑完後,答案陣列就已經依照題目要求排好了,直接回傳即可。
⏱️ 複雜度
- 時間複雜度:
O(n)只掃一次前半段與後半段配對。 - 空間複雜度:
O(n)額外建立了一個長度為2n的答案陣列,常數忽略後為O(n)。
💻 程式碼實作
class Solution {
public:
vector<int> shuffle(vector<int>& nums, int n) {
vector<int> ans(2 * n);
for (int i = 0; i < n; i++) {
ans[2 * i] = nums[i];
ans[2 * i + 1] = nums[i + n];
}
return ans;
}
};
🔗 題目連結
https://leetcode.com/problems/shuffle-the-array/