leadcode的Hot100系列--78. 子集

来源:https://www.cnblogs.com/payapa/archive/2019/07/03/11124106.html
-Advertisement-
Play Games

看一個數組的子集有多少,其實就是排列組合, 比如:[0,1] 對應的子集有:[] [0] [1] [1,1] 這四種。 一般對應有兩種方法: 位運算 和 回溯 。 這裡先使用位運算來做。 位運算 一個長度為n的數組,對其做排列組合,可以理解為:這n個數字中,有哪些是存在的,哪些是不存在的。 例如,數 ...


看一個數組的子集有多少,其實就是排列組合,
比如:[0,1] 對應的子集有:[] [0] [1] [1,1] 這四種。
一般對應有兩種方法:位運算回溯
這裡先使用位運算來做。

位運算

一個長度為n的數組,對其做排列組合,可以理解為:這n個數字中,有哪些是存在的,哪些是不存在的。
例如,數組為[1,2,3],可以組合為:[1,2],則說明1和2是存在的,3是不存在的,
我們可以這麼規定一下: 用1標記為存在,0標記為不存在
那麼[1,2]這個組合就可以用 110來標記,[1,3]的組合就可以用101來標記,[]的組合就可以用000來標記。
(註:這裡為方便理解,將數組直觀的位置與標記一一對應,而不考慮數組下標,
實際代碼中,是用下標來做對應的)
這樣的話:

數組的排列組合問題,就轉換為每個數字的存在或者不存在的問題。

這裡有三個數字,每個數字都會有存在和不存在的兩種情況,總共就會有8種排列,分別是:
000,001, 010, 011, 100, 101, 110, 111
對應的數組分別是:
[],[3],[2], [2,3], [1], [1,3], [1,2], [1,2,3]

重點來了:如果把上面的01標記看成二進位數字的,那對應的十進位數字就是0,1,2,3,4,5,6,7。
這裡先統稱這些數字為flag(用來標記對應位置的數字是否存在)。
所以,當我已經知道總共的組合有n種的時候,那麼就會有 0 到 (n-1) 個 flag 來標記對應位置的數字是否存在。
那麼代碼中是怎麼對應的呢?這次用數組[6,7,8]來舉例。
數字6,7,8對應的下標分別是 0,1,2,對應的位置就是 (1 << 下標),
那麼:6對應的是flag中的第1位(1<<0),7對應的是flag中的2位(1<<1),8對應的是flag中的第3位(1<<2)。
所以,實際代碼中 當flag = 1 (二進位位001)的時候,對應的組合是 [6],flag = 3(二進位位011)的時候,對應的組合是[6,7]。

ps:因為題目要求輸出的形式是:[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]
這個的話,感覺用c不太好實現,所以就偷偷用了python來實現了,但原理還是一樣的!

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        subList = []
        length = len(nums)
        totalCount = pow(2, length)     # 得到子集的總個數
        for flag in range(totalCount):   # 遍歷各個flag標記
            sub = []
            for xiabiao in range(length):  # 遍曆數組下標,查看對應位置的數字是否存在
                if flag & (1<<xiabiao):
                    sub.append(nums[xiabiao])  # 如果對應的數字存在,就把該數字放入新數組中
            subList.append(sub)
        return subLis

遞歸放在下一篇講解。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 跟我學SpringCloud | 第三篇:服務的提供與Feign調用 上一篇,我們介紹了註冊中心的搭建,包括集群環境嚇註冊中心的搭建,這篇文章介紹一下如何使用註冊中心,創建一個服務的提供者,使用一個簡單的客戶端去調用服務端提供的服務。 本篇文章中需要三個角色,分別是服務的提供者,服務的消費者,還有一 ...
  • ↵ 【編者的話】微服務的概念源於 2014 年 3 月 Martin Fowler 所寫的一篇文章“Microservices”。文中內容提到:微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。 背景 應用系統的架構歷史 什麼是微服務? ...
  • 我們旅程的最後階段的三個主要目標是使系統對故障更具彈性,提高UI的響應能力,並確保我們的設計是可伸縮的。加強系統的工作主要集中在訂單和註冊限界上下文中的RegistrationProcessManager類。性能改進工作的重點是當訂單創建時UI與領域域模型的交互方式。 ...
  • 一年前,當我和小伙伴小龍一起做一個外包項目的時候,受到了嚴重的鄙視。我那時候還不知道 Maven,所以搭建項目用的還是最原始的方式,小龍不得已在導入項目的時候花了很長時間去下載項目依賴的開源類庫。 出於對我的尊重,小龍沒有破口大罵,而是非常委婉地說了一句:“二哥,你好歹也有一定的知名度了,竟然沒用 ...
  • Go程式是怎樣跑起來的?本文從編碼、編譯、彙編、鏈接、運行、退出這些環節一一探索。 ...
  • ![](https://img2018.cnblogs.com/blog/1728961/201907/1728961-20190703082545108-1217931464.png) ...
  • 本人在 .NET 轉JAVA 的路上 ,也在學習SpringBoot相關知識,這裡記錄一下在Springboot中實現文件上傳下載的核心代碼 源碼下載地址: https://github.com/struggle0903/SpringBootfiledemo.git ...
  • 點擊屏幕拍打你的翅膀。當你飛過屏幕時,註意黑烏鴉。 下載地址 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...