数据结构与算法--数组中出一次的数字
數(shù)組中出現(xiàn)一次的數(shù)字
-
題目:一個(gè)整型數(shù)組里面除了一個(gè)數(shù)字以外,其他數(shù)字都出現(xiàn)了兩次。找出這個(gè)出現(xiàn)一次的數(shù)字,時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(1)
-
如上題中最簡單的方法就是一次循環(huán)統(tǒng)計(jì),之后在循環(huán)判斷出值出現(xiàn)一次的數(shù)字,但是空間復(fù)雜度會(huì)達(dá)到O(n)達(dá)不到題目中的要求,最直觀的方法往往不是我們需要找的最優(yōu)解
-
題目中強(qiáng)調(diào)了只有一個(gè)數(shù)字出現(xiàn)了一次,其他都是2次,強(qiáng)調(diào)的1次和2次肯定會(huì)是有用的條件,我在之前的文章:數(shù)據(jù)結(jié)構(gòu)與算法–位運(yùn)算中有詳細(xì)解釋了異或相關(guān)操作以及應(yīng)用,相同的兩個(gè)數(shù)據(jù)異或得到的永遠(yuǎn)是0
-
我們可以利用異或逐個(gè)去對(duì)每個(gè)數(shù)據(jù)進(jìn)行操作,得到最終的數(shù)據(jù)就是我們需要的獨(dú)立出現(xiàn)的數(shù)據(jù),
-
如上分析有如下代碼:
- 以上實(shí)現(xiàn)我們用一次遍歷得到結(jié)果,時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(1)
變種題型,如果有兩個(gè)不同的數(shù),求這兩個(gè)
-
以上題型中我們用異或的方式找出了一個(gè)不同的數(shù)據(jù),那能不能用相同的的方法解決兩個(gè)的情況。
-
分析:
- 還是逐個(gè)異或,我們得到的比如是兩個(gè)不同數(shù)據(jù)異或的結(jié)果
- 如果我們能將這個(gè)數(shù)組拆分開,并且讓兩個(gè)不同的數(shù)據(jù)分布在兩個(gè)不同的數(shù)組中
- 如果做到如上這點(diǎn),我們可以套用以上的方案去解題,假設(shè)不同數(shù)據(jù)分別是n, m
- 假設(shè)我們異或得到的數(shù)據(jù)是k, 異或的定義,相同位異或得到0,不同位異或得到1
- 那么我們?cè)跀?shù)據(jù) k的二進(jìn)制位中任意找一位,我們找第一位是1 位置標(biāo)記為position
- 我們遍歷 數(shù)組,判斷所有數(shù)據(jù)中 position 位置是否為1,是1 則放入第一個(gè)數(shù)組,是二則放入
- 此時(shí)n, m的position 為必然是不同的,這個(gè)時(shí)候我們就可以將n, m區(qū)分開來到兩個(gè)數(shù)組
- 同理,相同的兩個(gè)數(shù)據(jù)z,z’,相同的position位必然是一樣,那么必然在一個(gè)數(shù)組中
- 至此我們將兩個(gè)數(shù)據(jù)拆分開
- 經(jīng)過如上分析有如下代碼:
- 如上實(shí)現(xiàn)中利用異或運(yùn)算的特性來篩選出不同的兩個(gè)數(shù)據(jù),并且利用 與 運(yùn)算倆排查 第n位上的數(shù)據(jù)是否為1,用2次循環(huán)得到結(jié)果,時(shí)間復(fù)雜度為O(n),但是空間復(fù)雜度也是O(n)
- 我們可以對(duì)他進(jìn)行如下改造,不存儲(chǔ)直接運(yùn)算得出結(jié)果,如下
- 如上實(shí)現(xiàn),我們得到時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(n)的實(shí)現(xiàn)方案
上一篇:數(shù)據(jù)結(jié)構(gòu)與算法–二叉樹的深度問題
下一篇:數(shù)據(jù)結(jié)構(gòu)與算法–有序數(shù)組中找出和為s的兩個(gè)數(shù)字
總結(jié)
以上是生活随笔為你收集整理的数据结构与算法--数组中出一次的数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刮痧拔罐同时做可以吗
- 下一篇: 数据结构与算法--有序数组中找出和为s的