Java?C++題解leetcode672燈泡開關(guān)示例
題目要求


思路:找規(guī)律
找到盡可能最精簡的通項表達(dá),今日參考:京城打工人
首先,歸納每個開關(guān)會影響的燈,其中(k=0,1,2,…):
| 開關(guān) | 反轉(zhuǎn)燈編號 |
|---|---|
| 一 | k |
| 二 | 2k |
| 三 | 2k+1 |
| 四 | 3k+1 |
可見燈以6盞為周期具有相同變化,所以以下只需要推導(dǎo)第一個周期里的6盞燈即可。
觀察前6盞燈:
| 燈 | 開關(guān) |
|---|---|
| 1 | 一、三、四 |
| 2 | 一、二 |
| 3 | 一、三 |
| 4 | 一、二、四 |
| 5 | 一、三 |
| 6 | 一、二 |
發(fā)現(xiàn)燈2、6和3、5分別受同樣的開關(guān)影響,所以狀態(tài)相同;
觀察前4盞燈,發(fā)現(xiàn)燈1、3與燈2、4存在規(guī)律:
- 當(dāng)開關(guān)
四按動次數(shù)為偶數(shù)時,兩組燈狀態(tài)分別相同; - 當(dāng)開關(guān)
四按動次數(shù)為奇數(shù)時,兩組燈狀態(tài)分別不同; - 所以根據(jù)其中一組燈的狀態(tài)即可判斷另一組。
因此,選擇一組+另一組中的一盞,即可涵蓋所有燈的狀態(tài)。
因此選擇觀察前三盞燈即可預(yù)知所有明暗狀態(tài):
前三盞燈在不同按動次數(shù)中的狀態(tài)如下:

發(fā)現(xiàn)在一次按動時會出現(xiàn)四種狀態(tài),兩次按動時出現(xiàn)七種狀態(tài)【缺少011狀態(tài)】,三次及以上按動即可出現(xiàn)所有狀態(tài),共2^3=8種。
此時僅需枚舉一盞燈和兩盞燈時的狀態(tài)即可,后續(xù)都與三盞相同:
- 一盞燈僅可能有兩種狀態(tài);
- 兩盞燈可能有四種狀態(tài);
但按動一次時僅會出現(xiàn)三種情況【缺少11狀態(tài)】:

- 將上述規(guī)律歸納為代碼即可!
Java
class Solution {
public int flipLights(int n, int presses) {
if (presses == 0)
return 1;
if (n == 1)
return 2;
else if (n == 2)
return presses == 1 ? 3 : 4;
else
return presses == 1 ? 4 : presses == 2 ? 7 : 8;
}
}
- 時間復(fù)雜度:O(1)O(1)O(1)
- 空間復(fù)雜度:O(1)O(1)O(1)
C++
class Solution {
public:
int flipLights(int n, int presses) {
if (presses == 0)
return 1;
if (n == 1)
return 2;
else if (n == 2)
return presses == 1 ? 3 : 4;
else
return presses == 1 ? 4 : presses == 2 ? 7 : 8;
}
};
- 時間復(fù)雜度:O(1)
- 空間復(fù)雜度:O(1)
Rust
- 淺學(xué)一下rust的
match~
impl Solution {
pub fn flip_lights(n: i32, presses: i32) -> i32 {
if presses == 0 {
return 1;
}
match n {
1 => 2,
2 => {
match presses {
1 => 3,
_ => 4
}
},
_ => {
match presses {
1 => 4,
2 => 7,
_ => 8
}
},
}
}
}
- 時間復(fù)雜度:O(1)
- 空間復(fù)雜度:O(1)
總結(jié)
本來以為要DP或者生模擬,結(jié)果是數(shù)學(xué)思維找規(guī)律。
一道代碼無敵簡單,思路究極繞的題目,以至于推導(dǎo)完思路感覺就結(jié)束了【代碼都沒啥區(qū)別……】
以上就是Java C++題解leetcode672燈泡開關(guān)示例的詳細(xì)內(nèi)容,更多關(guān)于Java C++題解燈泡開關(guān)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java使用單向鏈表解決數(shù)據(jù)存儲自定義排序問題
本文主要介紹了java使用單向鏈表解決數(shù)據(jù)存儲自定義排序問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
基于Security實現(xiàn)OIDC單點登錄的詳細(xì)流程
本文主要是給大家介紹 OIDC 的核心概念以及如何通過對 Spring Security 的授權(quán)碼模式進(jìn)行擴(kuò)展來實現(xiàn) OIDC 的單點登錄。對Security實現(xiàn)OIDC單點登錄的詳細(xì)過程感興趣的朋友,一起看看吧2021-09-09
jdbc鏈接遠(yuǎn)程數(shù)據(jù)庫進(jìn)行修改url操作
這篇文章主要為大家詳細(xì)介紹了jdbc鏈接遠(yuǎn)程數(shù)據(jù)庫進(jìn)行修改url操作,感興趣的小伙伴們可以參考一下2016-06-06
MyBatisPlus-QueryWrapper多條件查詢及修改方式
這篇文章主要介紹了MyBatisPlus-QueryWrapper多條件查詢及修改方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

