Q1. Toggle Light Bulbs

練習日期:2026-02-15

難度:Easy

類型:Array、Hash Table、Sorting、Simulation、Weekly Contest 489

📘 題目敘述

給你一個整數陣列 bulbs,其中每個元素都介於 1 到 100。

有 100 顆燈泡,編號從 1 到 100,一開始全部都是關的。

對於陣列 bulbs 中的每個元素 bulbs[i]

如果第 bulbs[i] 顆燈泡目前是關的,就把它打開;否則就把它關掉。

請回傳最後仍然亮著的燈泡編號清單,並且要依照遞增順序排序。如果最後沒有任何燈泡亮著,就回傳空陣列。

條件限制

  • 1 <= bulbs.length <= 100
  • 1 <= bulbs[i] <= 100

🧠 解題思路

這題就是照題目做「開關切換」。

我用一個大小 101 的布林陣列 swi 來記錄每顆燈泡目前是開還是關(燈泡編號是 1~100,所以不用 index 0)。

流程分成兩段:第一段掃過 bulbs,遇到編號 i 就把 swi[i] 的狀態翻轉一次;第二段把所有 swi[j] == true 的編號 j 收集起來放進 open,最後回傳 open

因為我是從 1 掃到 100 收集,所以輸出自然就是遞增排序。

所有變數

  • swivector<bool>,記錄第 j 顆燈泡最後是亮著(true)或關著(false)
  • openvector<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)nbulbs.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/contest/weekly-contest-489/problems/toggle-light-bulbs/

作者:scottnick
撰寫日期:2026-02-15
類別:
原文連結:https://scottnick.github.io/cpp-notes/contests/weekly-contest-489/q1-toggle-light-bulbs.html