📘 題目敘述
給你一個整數陣列 bulbs,其中每個元素都介於 1 到 100。
有 100 顆燈泡,編號從 1 到 100,一開始全部都是關的。
對於陣列 bulbs 中的每個元素 bulbs[i]:
如果第 bulbs[i] 顆燈泡目前是關的,就把它打開;否則就把它關掉。
請回傳最後仍然亮著的燈泡編號清單,並且要依照遞增順序排序。如果最後沒有任何燈泡亮著,就回傳空陣列。
條件限制
1 <= bulbs.length <= 1001 <= bulbs[i] <= 100
🧠 解題思路
這題就是照題目做「開關切換」。
我用一個大小 101 的布林陣列 swi 來記錄每顆燈泡目前是開還是關(燈泡編號是 1~100,所以不用 index 0)。
流程分成兩段:第一段掃過 bulbs,遇到編號 i 就把 swi[i] 的狀態翻轉一次;第二段把所有 swi[j] == true 的編號 j 收集起來放進 open,最後回傳 open。
所有變數
swi:vector<bool>,記錄第j顆燈泡最後是亮著(true)或關著(false)open:vector<int>,把最後亮著的燈泡編號依序收集起來
🪜 主要流程步驟
1. 建立狀態表 swi,初始化全部關閉
建立 swi(101, false),代表 1~100 號燈泡一開始全部都是關的。
2. 依序處理 bulbs,對指定燈泡做一次翻轉
掃過 bulbs 每個元素 i,對 swi[i] 做狀態切換:關變開、開變關。
3. 把最後仍然亮著的燈泡編號收集進 open
從 j = 1 掃到 100,只要 swi[j] == true 就把 j 放進 open。
4. 回傳 open
如果沒有任何亮著的燈泡,open 會是空陣列,直接回傳即可。
⏱️ 複雜度
- 時間複雜度:
O(n + 100),n是bulbs.length。 - 空間複雜度:
O(100),swi固定長度 101,open最多收集 100 個元素。
💻 程式碼實作
class Solution {
public:
vector<int> toggleLightBulbs(vector<int>& bulbs) {
vector<bool> swi(101, false);
vector<int> open;
for (int i : bulbs) {
swi[i] = (swi[i] == false);
}
for (int j = 1; j < 101; j++) {
if (swi[j]) {
open.push_back(j);
}
}
return open;
}
};
🔗 題目連結
https://leetcode.com/problems/toggle-light-bulbs/