亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何計算數組中數字出現的次數

發布時間:2021-12-15 13:46:26 來源:億速云 閱讀:162 作者:小新 欄目:大數據

這篇文章將為大家詳細講解有關LeetCode如何計算數組中數字出現的次數,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。        

題目描述

一個整型數組 nums 里除兩個數字之外,其他數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求時間復雜度是 O(n),空間復雜度是 O(1)。

  • 2 <= nums.length <= 10000
                     

題目樣例          

示例

  • 輸入:nums = [4,1,4,6]

  • 輸出:[1,6] 或 [6,1]

  • 輸入:nums = [1,2,10,4,1,4,3,3]

  • 輸出:[2,10] 或 [10,2]

                     

題目思考

  1. 如果其他數字都出現兩次, 只有一個數字出現一次如何解決?
  2. 如何做到空間復雜度是 O(1)?
                     

解決方案

                     
思路
  • 分析題目, 相信大家都能想到計數字典的方案, 就是記錄每個數字的次數, 然后找次數為 1 的數字, 但這樣空間復雜度為 O(N), 不滿足要求
  • 我們先來分析一個簡化問題:                          如果其他數字都出現兩次, 只有一個數字出現一次如何解決?
    • 這個問題估計不少同學都見過, 一個很巧妙的做法是                           異或所有數字, 因為兩個相同數字的異或結果一定為 0, 所以最終異或的結果一定是那個出現一次的數字
  • 那針對這道題, 還可以利用異或思路嗎?
  • 答案是肯定的, 假設我們還是異或所有數字, 那么                          最終異或出來的值等價于那兩個出現一次的數字的異或結果, 因為其他出現兩次的數字異或都是 0, 對最終異或結果沒有影響.
  • 而異或結果中的某一位 1, 代表這兩個數字在這一位上的取值不同, 一個是 0, 一個是 1
  • 我們可以利用這一點,                          將原數組分為兩類, 一類是該位為 1 的, 一類是該位為 0 的. 對于出現兩次的數字而言, 它們肯定落在同一類里面; 而對于這兩個出現一次的數字, 它們被分屬在兩個不同類中.
  • 這樣問題就轉換成了上面描述的簡化問題, 只需要對這兩類分別求出它們的異或結果, 自然就是對應兩個出現一次的數字了~
  • 最后一個問題: 如何求異或結果 xor 的某一位 1 呢?
    • 我們可以利用循環, mask 從 1 開始, 判斷 xor 的這一位是否為 1, 是的話就跳出循環, 否則 mask 左移一位, 直到超出 xor
    • 當然還有更簡單的做法, 利用樹狀數組的 lowbit, 也即                           xor & -xor, 直接就能求得最低位的 1 對應的數字, 這個大家手動模擬下補碼就知道是為什么了
  • 下面代碼對必要的步驟有詳細的解釋, 方便大家理解
                     
復雜度
  • 時間復雜度 O(N): 遍歷兩遍數組
  • 空間復雜度 O(1): 只使用了幾個變量
                     
代碼
class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        # 先拿到所有數字的異或結果, 該結果一定至少有一位是1, 否則就不可能有兩個出現一次的數字
        xor = 0
        for n in nums:
            xor ^= n
        # 然后隨便針對異或結果的某一位1, 將原數組分為兩類, 自然兩個出現一次的數字就會分別落在不同類里面, 否則其異或結果的這一位不可能是1
        # 這里直接利用樹狀數組的lowbit(即原來的數字的最低位的1)
        mask = xor & -xor
        a, b = 0, 0
        for n in nums:
            if n & mask:
                # 如果數字的這一位是1, 歸為一類, 求它們的異或值, 即為其中一個出現一次的數
                a ^= n
            else:
                # 如果數字的這一位是0, 歸為另一類, 求它們的異或值, 即為另一個出現一次的數
                b ^= n
        return [a, b]
                                             

關于“LeetCode如何計算數組中數字出現的次數”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富锦市| 高尔夫| 忻州市| 原阳县| 平远县| 长葛市| 根河市| 霸州市| 罗平县| 余干县| 靖远县| 汕头市| 宝清县| 恩平市| 安图县| 日照市| 陆良县| 故城县| 北京市| 呼玛县| 鱼台县| 洛南县| 商洛市| 南涧| 邯郸县| 新野县| 嘉祥县| 资源县| 监利县| 鄂托克前旗| 佳木斯市| 许昌县| 蒙阴县| 乌拉特中旗| 宁安市| 桃园市| 彭阳县| 安仁县| 安康市| 塔城市| 石台县|