劍指offer題目二 陣列中重複數字

2021-10-02 06:15:59 字數 3497 閱讀 7218

在乙個長度為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的...