LeetCode 442.找出數(shù)組中所有重復(fù)的數(shù)字

問題

問題描述:給定一個整數(shù)數(shù)組,1 <= a[i] <= n,其中 n 為數(shù)組長度。有些元素出現(xiàn) 2 次,有些只出現(xiàn) 1 次,請找出所有出現(xiàn) 2 次的元素。

要求:在 O(n) 的時間內(nèi),并不使用額外的空間。

栗子:

輸入:
[4,3,2,7,8,2,3,1]

輸出:
[2,3]

想看英文的戳這里:原題地址

解題思路

如何判斷出現(xiàn)了 2 次呢?

按常規(guī)思路,可以用額外的數(shù)組或者 map 來記錄元素出現(xiàn)的次數(shù),這樣實現(xiàn)起來比較簡單。比如用數(shù)組 count[] 來記錄次數(shù)。

// 初始化 count[n] = 0,count 中有 n 個元素。

// 記錄每個數(shù)字出現(xiàn)的次數(shù)
count[a[i] - 1] += 1

但是題目要求不使用額外的空間,所以只能在數(shù)組 a[] 上做文章。

同時可以借鑒常規(guī)思路的做法,在 a[i] 出現(xiàn)時,將其標(biāo)記為已出現(xiàn)。由于 a[i] 全為正整數(shù),所以我們可以想到一個比較取巧的方式,就是將 a[i] 對應(yīng)位置的數(shù)標(biāo)記成 對應(yīng)的負(fù)數(shù), 即 a[a[i]-1] *= -1。當(dāng)再次遇到 a[i] 時,如果其對應(yīng)的數(shù)已經(jīng)為負(fù)數(shù),則可判斷為重復(fù)。

那么有個問題來了,如果遍歷過程中遇到之前標(biāo)記的負(fù)數(shù)了,怎么辦?很簡單,只要取 abs(a[i]) 即可。

步驟圖解

  1. 初始狀態(tài)
QQ20190410-0.png
  1. 遍歷 4,a[3] = -7

    QQ20190410-1.png
  2. 遍歷 3,a[2] = -2

QQ20190410-2.png
  1. 遍歷 2,a[1] = -3
QQ20190410-3.png
  1. 遍歷 7,a[6] = -3
QQ20190410-4.png
  1. 遍歷 8,a[7] = -1
QQ20190410-5.png
  1. 遍歷 2,a[1] 已經(jīng)為負(fù)數(shù),則表示重復(fù)
QQ20190410-6.png
  1. 遍歷 3,a[2] 已經(jīng)為負(fù)數(shù),則表示重復(fù)
QQ20190410-7.png
  1. 遍歷 1,a[0] = -1,結(jié)束。
QQ20190410-8.png

代碼實現(xiàn)

python 代碼如下:

class Solution(object):
    def findDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        res = []
        
        // 逐個遍歷,將 num 所對應(yīng)的 index 設(shè)置為負(fù)數(shù)。
        for num in nums:
            positiveNum = abs(num)
            
            // 已經(jīng)置為負(fù)數(shù),說明有相同的數(shù)
            if nums[positiveNum-1] < 0:
                res.append(positiveNum)
            else:
                nums[positiveNum-1] *= -1
        return res
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,007評論 0 2
  • 這個不錯分享給大家,從扣上看到的,就轉(zhuǎn)過來了 《電腦專業(yè)英語》 file [fail] n. 文件;v. 保存文...
    麥子先生R閱讀 7,104評論 5 24
  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁的形式展示給用戶的,因此網(wǎng)頁是網(wǎng)絡(luò)信息傳遞的載體。網(wǎng)頁文件是用...
    阿啊阿吖丁閱讀 4,929評論 0 0
  • 2017.8.16星期四 陣雨 今天早上來上班淋死了!正好下的大,上午孩子學(xué)會英語,下午就折紙,上癮了。下班也不...
    張萌張迪媽媽閱讀 300評論 0 0
  • 姓名:劉小瓊 公司:寧波大發(fā)化纖有限公司 寧波盛和塾《六項精進(jìn)》第235期學(xué)員 【日精進(jìn)打卡第141天】 知~學(xué)習(xí)...
    劉小瓊123閱讀 200評論 0 0

友情鏈接更多精彩內(nèi)容