1470. Shuffle the Array

練習日期:2026-03-12

難度:Easy

類型:Array

📘 題目敘述

給你一個陣列 nums,它共有 2n 個元素,格式為:

[x1, x2, ..., xn, y1, y2, ..., yn]

請回傳重新排列後的陣列:

[x1, y1, x2, y2, ..., xn, yn]

條件限制

  • 1 <= n <= 500
  • nums.length == 2n
  • 1 <= nums[i] <= 10^3

🧠 解題思路

這題的重點很直接:

題目已經把原本陣列切成兩半了:

  • 前半段是 x1 ~ xn
  • 後半段是 y1 ~ yn

而我要做的事情,就是把這兩半交錯放進答案陣列裡:

  • 0 個位置放 x1
  • 1 個位置放 y1
  • 2 個位置放 x2
  • 3 個位置放 y2

一路這樣排下去。

所以我用一個迴圈跑 i = 0 ~ n-1,每次處理一組:

  • nums[i] 是第 i+1x
  • nums[i+n] 是第 i+1y

然後把它們放到答案陣列的:

  • 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] 是一個 x
  • nums[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 = 0
    • ans[0] = x1
    • ans[1] = y1
  • i = 1
    • ans[2] = x2
    • ans[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/

作者:scottnick
撰寫日期:2026-03-12
類別:
原文連結:https://scottnick.github.io/cpp-notes/all%20problems/1470-shuffle-the-array.html