2-数组中重复的数字
生活随笔
收集整理的這篇文章主要介紹了
2-数组中重复的数字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2-數組中重復的數字
一、問題描述: 找出數組中重復的數字
在一個長度為n的數組里的所有數字都在0~n-1的范圍內,數組中某些數字是重復的,但不知道有幾個數字重復,也不知道重復了幾次。請找出數組中任意一個重復的數字。
- 排序
- 哈希表。從頭到尾按順序掃描數組的每個數字,每掃描到一個數字,都可以用O(1)的時間來判斷哈希表里是否已經包含了該數字。如果哈希表里還沒有這個數字,就把它加入哈希表,如果哈希表里已經存在該數字,就找到一個重復的數字。這個算法的時間復雜度是O(n),但它提高時間效率是以一個大小為O(n)的哈希表為代價的
- 重排數組。數組元素都在0~n-1之間,如果這個數組沒有重復的數字,那么當數組排序之后數字i會出現在下標為i的位置。從頭到尾依次掃描這個數組中的每個數字,當掃描到下標為i的數字時,首先比較這個數字(m)是不是等于i;如果是,則接著掃描下一個數字;如果不是,則再拿它和第m個數字進行比較,如果它和第m個數字相等,就找到了一個重復的數字,如果它和第m個數字不相等,就把第i個數字和第m個數字交換,把m放到屬于它的位置。接下來重復這個比較、交換的過程,直到發現一個重復的數字。
二、問題描述: 不修改數組找出重復的數字
在一個長度為n+1的數組里的所有數字都在1-n的范圍內,所以數組中至少有一個數字是重復的。請找出數組里任意一個重復的數字,但不能修改數組
- 創建一個長度為n+1的輔助數組,然后逐一把原數組的每一個數字復制到輔助數組。如果原數組中被復制的數字是m,則把它復制到輔助數組中下標為m的位置,這樣就很容易發現哪個數字是重復的。該方案需要O(n)的輔助空間
- 某范圍里數字的個數。把1-n的數字從中間的數字m分為兩部分,前面一半為1-m,后面一半為m+1-n。如果1-m的數字的個數超過m,那么這一半的區間里一定包含重復的數字;否則,另一半m+1-n的區間里一定包含重復的數字。繼續把包含重復數字的區間一分為二,直到找到一個重復的數字。和二分查找算法很類似,只是多了一步統計區間里數字的數目。
轉載于:https://www.cnblogs.com/CodingML-1122/p/9189911.html
總結
以上是生活随笔為你收集整理的2-数组中重复的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 分组统计,抽取每组前十
- 下一篇: Docker Machine 简介