之前有寫過 找出陣列中只出現一次的數,今天再來看下怎麼找出陣列中重複出現的數。
有乙個長度為 n 的陣列,所有的數字都在 0~n-1 的範圍,現在要求找出陣列中任意乙個重複的數字。這個題目看起來很簡單,看看下面幾種思路。
思路一:
先給陣列排序,然後再遍歷一遍有序陣列,依次比較相鄰元素,就很容易能找出陣列中重複的值。使用快排排序的話時間複雜度為 o(nlogn) 。
思路二:
利用空間換時間的思想,新建乙個雜湊表,然後遍歷陣列,每掃瞄乙個元素都去雜湊表裡查詢是否也存在該元素,如果存在,即找到乙個重複的數,如果不存在,則將該元素儲存到雜湊表。這個思路的時間複雜度為 o(n),但空間複雜度也為 o(n)。
思路三:
認真審題,你會發現有一些特點,長度為 n 的陣列,且元素的大小範圍為 0~n-1,如果沒有重複的數字的話,那麼陣列排序後數字 i 就是下標 i 所在的位置了,即 arr[i] == i。所以我們可以巧妙利用陣列的下標特性來尋找解決方案。
如果上面那句話還沒看明白,看下面這個例子你就知道了。
#arr陣列中沒有重複元素的情況
#陣列長度為7,元素範圍為0-6
arr = [0,1,2,3,4,5,6]
arr[0] == 0
arr[1] == 1
arr[2] == 2
我們通過乙個具體的例子來捋一捋思路,先準備乙個陣列。
arr = [4,1,1,3,5,2,5]
從頭開始遍歷陣列,判斷 arr[i] 是否等於 i,如果等於則無需任何操作繼續往後遍歷。
如果 arr[i] 不等於 i,則繼續拿 arr[i] 和 arr[arr[i]] 比較,如果 arr[i] 和 arr[arr[i]] 相等,則找到乙個重複的數,因為該數字在 i 下標和 arr[i] 下標同時出現了。
如果 arr[i] 和 arr[arr[i]] 不相等,那就交換他們的位置,交換的目的就是為了把 arr[i] 放到屬於他的位置,保證 arr[i] == i。
交換了之後,再重複上面的比較、交換操作,直到找到乙個重複的數。
arr = [4,1,1,3,2,5,5]
arr[0] != 0
則比較 arr[0] 和 arr[4]
arr[0] != arr[4]
則交換 arr[0] 和 arr[4] 的位置
新陣列變成
arr = [2,1,1,3,4,5,5]
再從頭開始遍歷比較
arr[0] != 0
則比較 arr[0] 和 arr[2]
arr[0] != arr[2]
則交換 arr[0] 和 arr[2] 的位置
新陣列變成
arr = [1,1,2,3,4,5,5]
再從頭開始遍歷比較
arr[0] != 0
則比較 arr[0] 和 arr[1]
arr[0] == arr[1]
找到乙個重複的數
你可能會問,為什麼要交換,交換的目的就是為了把元素放到屬於它的位置上,要讓這個陣列滿足 arr[i] == i,換句話說就是不斷的調整陣列,使其滿足 arr[i] == i,比如陣列中第乙個元素 arr[0] 為 4 ,那就要把元素 4 放到下標為 4 的位置上去。下面是乙份用 python 實現的完整**,大家可以參考下。
# encoding=utf-8
def findduplicate(arr):
if arr is none:
return false
for i in arr:
while arr[i] != i:
if (arr[i] == arr[arr[i]]):#找到重複的值
return arr[arr[i]]
else:#如果不相等就交換位置
temp = arr[arr[i]]
arr[arr[i]] = arr[i]
arr[i] = temp
return false
arr = [4,1,1,3,5,2,5]
print(findduplicate(arr))
C 查詢乙個數是否在陣列中find用法
在這裡可以發現直接輸出a為陣列首元素的位址在這裡是0x00b3f8a0,a 4即為加4個int型別長度,即是加16個位元組位0x00b3f8b0,這裡sizeof a 為20,則a sizeof a sizeof a 0 a 5,所以位址為0x00b3f8b4.在這裡find也是返回位址值的 00b...
js 判斷乙個值是否在陣列中
js判斷乙個值是否存在陣列中 瓊臺部落格 定義乙個判斷函式 var in array function arr 遍歷是否在陣列中 for var i 0,k arr.length i 如果不在陣列中就會返回false return false 給字串新增原型 string.prototype.in ...
js判斷乙個元素是否在陣列中
js中存在乙個陣列,如何判斷乙個元素是否存在於這個陣列中呢,首先是通過迴圈的辦法判斷,如下 var arr a s d f console.info isinarray arr,a 迴圈的方式 使用迴圈的方式判斷乙個元素是否存在於乙個陣列中 param arr 陣列 param value 元素值 ...