涂色不踩雷:如何優雅解決 LeetCode 柵欄涂色問題

在這里插入圖片描述
在這里插入圖片描述

文章目錄

    • 摘要
    • 描述
      • 例子:
    • 題解答案(Swift)
    • 題解代碼分析
      • 動態規劃核心思路
      • 初始條件
    • 示例測試及結果
      • 示例 1:
      • 示例 2:
      • 示例 3:
    • 時間復雜度
    • 空間復雜度
    • 總結
    • 實際場景聯系

摘要

在用戶體驗和界面設計中,顏色搭配是個繞不開的核心問題。而在 LeetCode 的一道經典題目「柵欄涂色」中,系統地將這個看似簡單的“上色”問題轉化為一道有趣的動態規劃挑戰。今天我們就用 Swift 帶你一探這個問題背后的“涂色學”,并分析它的數學規律、代碼實現以及實際意義。

描述

題目大意很簡單:你要給一排 n 根柵欄涂色。你一共有 k 種顏色可以選擇,但有一個限制條件:不能有超過兩根相鄰的柵欄使用同一種顏色

你需要返回總共有多少種不同的涂色方法。

例子:

輸入: n = 3, k = 2
輸出: 6
解釋:
可能的涂色方式如下:
1. 紅 紅 藍
2. 紅 藍 紅
3. 紅 藍 藍
4. 藍 藍 紅
5. 藍 紅 藍
6. 藍 紅 紅

題解答案(Swift)

這個題目是動態規劃的典型題,我們需要考慮狀態轉移和子問題的劃分。簡單來說,我們要區分兩種情況:

  • same: 最后兩根柵欄顏色相同
  • diff: 最后兩根柵欄顏色不同

根據這兩個狀態,我們可以構造出一個高效的遞推公式。

func numWays(_ n: Int, _ k: Int) -> Int {if n == 0 { return 0 }if n == 1 { return k }var same = 0var diff = kvar total = same + difffor _ in 2...n {same = diffdiff = total * (k - 1)total = same + diff}return total
}

題解代碼分析

動態規劃核心思路

我們用 same 表示前兩根柵欄顏色相同的方案數,diff 表示前兩根顏色不同的方案數。總方案數就是這兩者之和。

遞推關系如下:

  • 當前的 same = diff(因為如果前一輪是不同色的,當前這一輪就可以延續相同顏色)
  • 當前的 diff = total * (k - 1)(從上一個狀態的所有組合中選擇不同的顏色)

我們每輪都更新這兩個變量,直到涂完 n 根柵欄。

初始條件

  • n = 1,只有 k 種可能。

  • n = 2,我們可以有:

    • 相同顏色:k(比如紅紅、藍藍)
    • 不同顏色:k * (k - 1)(比如紅藍、藍紅)

示例測試及結果

示例 1:

let result = numWays(3, 2)
print(result)  // 輸出: 6

這個結果就跟題目中的例子一致,一共 6 種組合。

示例 2:

let result = numWays(1, 3)
print(result)  // 輸出: 3

只有一根柵欄,那就直接從三種顏色里選一種。

示例 3:

let result = numWays(4, 3)
print(result)  // 輸出: 66

解釋較復雜,但動態規劃會自動幫你計算出來所有組合。

時間復雜度

  • O(n)
    我們遍歷一遍從 2 到 n,所以時間復雜度是線性的。

空間復雜度

  • O(1)
    我們只用了幾個變量,沒有額外數組存儲,空間復雜度為常數級。

總結

這個問題雖然看起來像是簡單的排列組合,但真正下手的時候會發現,不加限制的排列很容易,但加了“不能超過兩個相同顏色”的規則后就變得有點挑戰性了。

動態規劃的好處就是可以把問題拆成更小的部分,一步步向目標推進。在這題中,理解 samediff 這兩個狀態是關鍵。

實際場景聯系

想象你是個裝修師傅,客戶讓你刷墻,說每面墻可以選擇多種顏色,但不希望連續三面墻刷成一樣的顏色(太單調了)。你要怎么安排?其實就是這道題!

或者你是個前端開發者,在設計界面時,需要生成用戶界面卡片顏色的方案,同樣不能讓相鄰部分顏色一致。解決方法也就是應用這種動態遞推模型。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81078.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GEE計算 RSEI(遙感生態指數)

🛰? 什么是 RSEI?為什么要用它評估生態環境? RSEI(遙感生態指數,Remote Sensing Ecological Index) 是一種通過遙感數據計算得到的、綜合反映區域生態環境質量的指標體系。 它的設計初衷是用最少的變量&…

圖像處理:預覽并繪制圖像細節

前言 因為最近在搞畢業論文的事情,要做出一下圖像細節對比圖,所以我這里寫了兩個腳本,一個用于框選并同時預覽圖像放大細節,可顯示并返回框選圖像的坐標,另外一個是輸入框選圖像的坐標并將放大的細節放置在圖像中&…

基于javaweb的SSM駕校管理系統設計與實現(源碼+文檔+部署講解)

技術范圍:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

限制 MySQL 服務只能被內網 `192.168.1.*` 網段的設備訪問

1. 修改 MySQL 配置文件 MySQL 默認監聽所有網絡接口(0.0.0.0),需要將其綁定到內網 IP 地址或限制訪問范圍。 (1)編輯 MySQL 配置文件 找到 MySQL 的主配置文件,通常是 /etc/my.cnf 或 /etc/mysql/my.cnf。使用文本編輯器打開: sudo vi /etc/my.cnf(2)設置 bind-a…

uniapp-商城-55-后臺 新增商品(分類、驗證和彈窗屬性)

1、概述 在前面 ,我們將商品頁面的布局給完成了,這里來對表單的標簽輸入進行校驗,看看這里的校驗還是不是也需要兼容微信小程序,還有沒有前面遇到的自定義正則進行校驗的情況。 另外這里還需要完成商品屬性的添加,就是…

PyInstaller 打包后 Excel 轉 CSV 報錯解決方案:“excel file format cannot be determined“

一、問題背景 在使用 Python 開發 Excel 轉 CSV 工具時,直接運行腳本(python script.py)可以正常工作,但通過 PyInstaller 打包成可執行文件后,出現以下報錯: excel file format cannot be determined, you must specify an engine manually 該問題通常發生在使用pandas…

【HTML 全棧進階】從語義化到現代 Web 開發實戰

目錄 🌟 前言🏗? 技術背景與價值🩹 當前技術痛點🛠? 解決方案概述👥 目標讀者說明 🧠 一、技術原理剖析📊 核心概念圖解💡 核心作用講解🔧 關鍵技術模塊說明?? 技術選…

小結:網頁性能優化

網頁性能優化是提升用戶體驗、減少加載時間和提高資源利用率的關鍵。以下是針對網頁生命周期和事件處理的性能優化技巧,結合代碼示例,重點覆蓋加載、渲染、事件處理和資源管理等方面。 1. 優化加載階段 減少關鍵資源請求: 合并CSS/JS文件&a…

【AI學習】AI大模型技術發展研究月報的生成提示詞

AI大模型技術發展研究月報生成提示詞 請輸出AI大模型技術發展研究月報,要求如下: —————————— 任務目標 在今天({{today}})往前連續 30 天內,檢索已正式公開發表的、與AI大模型(參數量 ≥10B&am…

AI 實踐探索:輔助生成測試用例

背景 目前我們的測試用例主要依賴人工生成和維護,AI時代的來臨,我們也在思考“AI如何賦能業務”,提出了如下命題: “探索通過AI輔助生成測試用例,完成從需求到測試用例生成的穿刺”。 目標 找全測試路徑輔助生成測…

C#實現訪問遠程硬盤(附源碼)

在現實場景中,我們經常用到遠程桌面功能,而在某些場景下,我們需要使用類似的遠程硬盤功能,這樣能非常方便地操作對方電腦磁盤的目錄、以及傳送文件。那么,這樣的遠程硬盤功能要怎么實現了? 這次我們將給出…

02.Golang 切片(slice)源碼分析(一、定義與基礎操作實現)

Golang 切片(slice)源碼分析(一、定義與基礎操作實現) 注意當前go版本代碼為1.23 一、定義 slice 的底層數據是數組,slice 是對數組的封裝,它描述一個數組的片段。兩者都可以通過下標來訪問單個元素。 數…

記參加一次數學建模

題目請到全國大學生數學建模競賽下載查看。 注:過程更新了很多文件,所有這里貼上的有些內容不是最新的(而是草稿)。 注:我們隊伍并沒有獲獎,文章內容僅供一樂。 從這次比賽,給出以下賽前建議 …

virtualbox虛擬機中的ubuntu 20.04.6安裝新的linux內核5.4.293 | 并增加一個系統調用 | 證書問題如何解決

參考文章:linux添加系統調用【簡單易懂】【含32位系統】【含64位系統】_64位 32位 系統調用-CSDN博客 安裝新內核 1. 在火狐下載你需要的版本的linux內核壓縮包 這里我因為在windows上面下載過,配置過共享文件夾,所以直接復制粘貼通過共享文…

[Java實戰]Spring Boot 3 整合 Ehcache 3(十九)

[Java實戰]Spring Boot 3 整合 Ehcache 3(十九) 引言 在微服務和高并發場景下,緩存是提升系統性能的關鍵技術之一。Ehcache 作為 Java 生態中成熟的內存緩存框架,其 3.x 版本在性能、功能和易用性上均有顯著提升。本文將詳細介紹…

LlamaIndex 第九篇 Indexing索引

索引概述 數據加載完成后,您將獲得一個文檔對象(Document)列表(或節點(Node)列表)。接下來需要為這些對象構建索引(Index),以便開始執行查詢。 索引(Index) 是一種數據結構,能夠讓我們快速檢索…

【問題排查】easyexcel日志打印Empty row!

問題原因 日志打印??I/O 操作開銷?(如 Log4j 的 FileAppender)會阻塞業務線程,直到日志寫入完成,導致接口響應變慢 問題描述 在線上環境,客戶反饋導入一個不到1MB的excel文件,耗時將近5分鐘。 問題排…

代碼隨想錄第51天|島嶼數量(深搜)、島嶼數量(廣搜)、島嶼的最大面積

1.島嶼數量&#xff08;深搜&#xff09; ---》模板題 版本一寫法&#xff1a;下一個節點是否能合法已經判斷完了&#xff0c;傳進dfs函數的就是合法節點。 #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -…

Made with Unity | 從影視到游戲:《魷魚游戲》IP 的邊界拓展

優質IP的跨媒體開發潛力不可限量。以現象級劇集《魷魚游戲》為例&#xff0c;Netflix旗下游戲工作室Boss Fight在第二季開播前夕推出的手游《Squid Game: Unleashed》&#xff0c;一經發布便橫掃全球107個國家和地區的App Store免費游戲榜首。 這款多人派對大逃殺游戲完美還原…

allure 報告更改標題和語言為中文

在網上看到好多談到更改allure 的標題設置都很麻煩&#xff0c;去更改JSON文件 其實可以有更簡單的辦法&#xff0c;就是在生成報表時增加參數 使用allure --help 查看&#xff1a; --lang, --report-language 設置報告的語言&#xff0c;默認是應用 The report language. …