首页
/
每日頭條
/
職場
/
LeetCode78面試常用小技巧
LeetCode78面試常用小技巧
更新时间:2025-05-18 06:44:52

LeetCode78面試常用小技巧?今天是LeetCode專題第47篇文章,我們一起來看下LeetCode的第78題Subsets(子集),我來為大家科普一下關于LeetCode78面試常用小技巧?下面希望有你要的答案,我們一起來看看吧!

LeetCode78面試常用小技巧(LeetCode78面試常用小技巧)1

LeetCode78面試常用小技巧

今天是LeetCode專題第47篇文章,我們一起來看下LeetCode的第78題Subsets(子集)。

這題的官方難度是Medium,點贊3489,反對79,通過率59.9%。從這個數據我們也可以看得出來,這是一道難度不是很大,但是質量很高的題。的确,在這道題的解法當中,你會學到一種新的技巧。

廢話不多說,我們先來看題意。

題意

這題的題意非常簡單,和上一題有的一拼,基本上從标題就能猜到題目的意思。給定一個沒有重複元素的int型數組,要求返回所有的子集,要求子集當中沒有重複項,每一項當中也沒有重複的元素。

樣例

Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]

照搬上題

剛拿到手可能有點蒙,但是稍微想一下就會發現,這一題和上題非常接近,兩者唯一的不同就是,子集沒有數量的限制,從空集開始,一直到它本身結束,不論多少個元素都可以。而上一題要求的是有數量限制的,也就是說上一題我們求的其實是限定了k個元素的子集。

想明白這點就簡單了,顯然我們可以複用上一題的算法,我們來遍曆這個k,從0到n,就可以獲得所有的子集了。隻要你上一題做出來了,那麼這題幾乎沒有任何難度。如果你沒有看過上一題的文章的話,可以通過傳送門回顧一下:

LeetCode 77,組合挑戰,你能想出不用遞歸的解法嗎?

我們直接來看代碼:

class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: # 上一題求解k個組合的解法 def combine(n, k, ret): window = list(range(1, k 1)) [n 1] j = 0 while j < k: cur = [] for i in range(k): cur.append(nums[window[i] - 1]) ret.append(cur[:]) j = 0 while j < k and window[j 1] == window[j] 1: window[j] = j 1 j = 1 window[j] = 1 # 手動添加空集 ret = [[]] n = len(nums) # 遍曆k從1到n for i in range(1, n 1): combine(n, i, ret) return ret

二進制組合

照搬上一題的解法固然是可行的,但是這麼做完全沒有必要,也得不到任何收獲。所以我們應該想一下新的解法。

既然這道題讓我們求的是所有的子集,那麼我們可以從子集的特點入手。我們之前學過,一個含有n個元素的子集的數量是2^n。這個很容易想明白,因為n個元素,每個元素都有兩個狀态,選或者不選。并且這n個元素互相獨立,也就是說某個元素選或者不選并不會影響其他的元素,所以我們可以知道一共會有2^n種可能。

我們也可以從組合數入手,我們令所有子集的數量為S,那麼根據上面我們用組合求解的解法,可以得到:

S = C_n^0 C_n^1 ... C_n^n = 2^n

兩者的結果是一樣的,說明這個結論一定是正确的。

不知道大家看到n個元素,每個元素有兩個取值有什麼想法,如果做過的題目數量夠多的話,應該能很快聯想到二進制。因為在二進制當中,每一個二進制位就隻有0和1兩種取值。那麼我們就可以用n位的二進制數來表示n個元素集合取舍的狀态。n位二進制數的取值範圍是[0, 2^n),所以我們一重循環去遍曆它,就相當于一重循環遍曆了整個集合所有的狀态。

這種技巧我們也曾經在動态規劃狀态壓縮的文章當中提到過,并且在很多題目當中都會用到。所以建議大家可以了解一下,說不定什麼時候面試就用上了。

根據這個技巧, 我們來實現代碼就非常簡單了。

class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: ret = [] n = len(nums) # 遍曆所有的狀态 # 1左移n位相當于2的n次方 for s in range(1 << n): cur = [] # 通過位運算找到每一位是0還是1 for i in range(n): # 判斷s狀态在2的i次方上,也就是第i位上是0還是1 if s & (1 << i): cur.append(nums[i]) ret.append(cur[:]) return ret

從代碼來看明顯比上面的解法短得多,實際上運行的速度也更快,因為我們去掉了所有多餘的操作,我們遍曆的每一個狀态都是正确的,也不用考慮重複元素的問題。

總結

不知道大家看完文章都有一些什麼感悟,可能第一種感悟就是LeetCode應該按照順序刷吧XD。

的确如此,LeetCode出題人出題都是有套路的,往往出了一道題之後,為了提升題目數量(湊提數),都會在之前題目的基礎上做變形,變成一道新題。所以如果你按照順序刷題的話,會很明顯地發現這一點。如果你從這個角度出發去思考的話,不但能理解題目之間的聯系,還能揣摩出出題人的用意,這也是一件很有趣的事情。

如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

本文始發于公衆号:TechFlow

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
渦輪增壓是怎麼實現增壓的(什麼是渦輪增壓)
渦輪增壓是怎麼實現增壓的(什麼是渦輪增壓)
  咱先說說發明渦輪增壓器的人是誰,比較公認的說法是一名瑞士工程師——比希,在1905年申報了專利,當時還主要應用于飛機和坦克的發動機上,直到20世紀70年代出現了一個轉折點,裝配渦輪增壓發動機的保時捷911問世,它于1977年,渦輪增壓技術才傳播的更加廣泛。   接下來我們說說,增壓的目的是什麼?渦輪增壓的主要作用就是提高發動機的進氣量,從而提高發動機的功...
2025-05-18
杜淳和陳喬恩最新消息(陳喬恩和杜淳年底結婚)
杜淳和陳喬恩最新消息(陳喬恩和杜淳年底結婚)
  娛樂圈最近最大的喜事莫過于謝娜懷上國民寶寶,半個娛樂圈的明星紛紛出動祝福娜姐。   因為和謝娜一起參加綜藝節目《我們來了》而成為好姐妹的陳喬恩和江一燕也在第一時間送上了祝福。      但卻一不小心成為了網友催婚的對象,更有意思的是竟然有博主曝出陳喬恩将在年底結婚!   結婚對象竟然是曾經一起參加過真人秀《旋風孝子》的杜淳!      看到爆料後,大家紛...
2025-05-18
涼山州脫貧攻堅個人事迹(涼山州表揚一批脫貧攻堅綜合幫扶工作先進集體和個人)
涼山州脫貧攻堅個人事迹(涼山州表揚一批脫貧攻堅綜合幫扶工作先進集體和個人)
     7月22日,涼山州脫貧攻堅綜合幫扶工作表揚大會暨決勝脫貧攻堅誓師大會在西昌召開,會議通報表揚10名“十佳綜合幫扶工作隊員”、 200名“優秀綜合幫扶工作隊員”、10個“十佳鄉鎮工作隊”、10個“十佳駐村工作隊”、10個“十佳專業技術服務隊”。   去年,省委着眼加強脫貧攻堅一線領導力量、專業力量、工作力量,舉全省之力向涼山選派綜合幫扶工作隊。一年來...
2025-05-18
兼職做淘寶模特需要交費嗎(我網店模特大學期間做兼職)
兼職做淘寶模特需要交費嗎(我網店模特大學期間做兼職)
  近年來,其實有很多年輕人都希望自己能夠在畢業之後獲得非常好的發展,能夠賺取穩定收入,但是有很多的網店模特或者是電商模特,他們的收入還是蠻高的,可是一些大學生在從事這份工作之後卻選擇了退出或者轉行,那麼為什麼大多數的年輕漂亮的大學生并不願意再去從事這份工作呢?      經過了解,看到有位女大學生分享了自己的工作經曆,女大學生小李在學校期間其實就是兼職做網...
2025-05-18
柯潔圍棋比賽賽程(每個省職業棋手盤點)
柯潔圍棋比賽賽程(每個省職業棋手盤點)
  不管是過去,亦或是現在,北京、上海、江蘇和浙江都是圍棋大省。其原因有三點。   第一,圍棋氛圍濃厚,高手衆多。第二,經濟發達,為圍棋發展提供了保障。第三,有一批傑出圍棋天才影響着當地圍棋愛好者。   今天非詳細說說浙江圍棋高手。   前面說過,浙江和北京上海以及江蘇都是圍棋大省職業不僅經濟發達圍棋基數大,而且有着一幫傑出圍棋天才影響着當地圍棋愛好者。遠有...
2025-05-18
Copyright 2023-2025 - www.tftnews.com All Rights Reserved