在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。
也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。
例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。
遍歷所有資料。* 29ms 9588k 時間複雜度o(n^2)
* // parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;
// here duplication like pointor in c/c++, duplication[0] equal *duplication in c/c++
// 這裡要特別注意~返回任意重複的乙個,賦值duplication[0]
// return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
*/public
static
boolean
duplicate1
(int numbers,
int length,
int[
] duplication)}}
return
false
;}
/**
** @param numbers
* @param length
* @param duplication
* @return
* 思路二:將陣列排序:排完序 比較相鄰的資料
時間複雜度為 o(nlogn)
*/public
static
boolean
duplicate2
(int numbers,
int length,
int[
] duplication)
}return
false
;}
思路三:利用hashset解決問題遍歷陣列,如果在hashset中存在該元素,則結束
如果不存在則將該元素加入hashset
時間複雜度:o(n)
空間複雜度:o(n)
public
static
boolean
duplicate3
(int numbers,
int length,
int[
] duplication)
else
}return
false
;}
我們注意到陣列中的數字都在0~n-1中,如果這個陣列中沒有重複的數字,那麼當陣列排序之後數字i將出現在位置i的位置上
由於陣列中有重複的數字,有些位置可能存在多個數字,同時可能有些位置沒有數字。
思路四: 從頭到尾依次掃瞄這個陣列。
當掃瞄到下標為i陣列時,首先比較這個數字(用m表示)是不是等於i。
如果是,接著掃瞄下乙個數字,
如果不是,則拿他和第m個數字進行比較。如果它和第m個數字相等,就找到了乙個重複數字(該數字在下標i和m都出現了) 如果它和第m個數字不相等,就把第i個數字和第m個數字交換,把m放到他的位置。
接下來重複這個比較交換的過程
核心:n個長度的陣列的n個資料若無重複,則必然可以按照順序依次排放,
其實就是一種選擇排序;但是這種演算法會破壞陣列的結構
時間複雜度:o(n)
public
static
boolean
duplicate4
(int numbers,
int length,
int[
] duplication)
else}}
return
false
;}
思路5: 為什麼陣列中有重複資料? 假設沒有重複數字,那麼從1~n的資料範圍內只有n個數字。
由於現在陣列裡包含超過n個數字,所以一定包含了重複數字。
看起來某個範圍內數字的個數對解決這個問題很重要
我們把從1n的數字從中間數字m分為兩部分,前面一部分為1m,後面一部分為m+1~n
如果1~m的數字的數目超過m那麼這一半一定包含了重複數字;否則另外一半包含了重複數字 *
我們可以繼續吧包含重複數字的區間一分為二,直到找到乙個重複的數字。
這個過程個二分查詢演算法狠類似,只是多了一步統計區間裡數字的數目。
時間複雜度:o(nlogn)
這種演算法不能保證找出所有重複數public
static
boolean
duplicate5
(int numbers,
int length,
int[
] duplication)
else}if
(count > mid - start+1)
else
}return
false;}
/** * 計算在陣列中 start-end資料出現的次數
* @param arr
* @param lenght
* @param start
* @param end
* @return
*/public
static
intcountrange
(int
arr,
int lenght,
int start,
int end)
}return count;
}
劍指Offer (陣列)陣列中重複的數字
題目鏈結 題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。解決方法class solution retur...
劍指offer 陣列 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。遍歷每乙個數字,在其後的數字中查詢是否有含有相同的數字 coding...
劍指Offer 陣列中的重複陣列
public boolean duplicate int numbers,int length,int duplication arrays.sort numbers for int i 0 i下面來看看乙個比較,交換的過程 原始陣列 第一次 i 0 陣列第0個元素是2,與下標不等,然後與下標為2的...