劍指offer 面試題3 陣列中重複的數字

2021-09-03 03:12:04 字數 2805 閱讀 5487

在乙個長度為n的陣列裡的所有數字都在0~n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列 那麼對應的輸出是重複的數字2或3。

時間複雜度o(n),空間複雜度o(n), 額外空間用於構建雜湊表

思想:建立乙個雜湊表,然後對當前陣列中元素遍歷,若當前所遍歷的元素不在雜湊表中,則放入,若存在即為重複數字。

對應關係【當前元素值 —>雜湊表的索引】。例: 當前遍歷位數字2, 如果hash[2]=true。表示已經2存在雜湊表中。

**如下:

# include

# include

# include

using namespace std;

bool duplicate

(int numbers,

int length,

int* duplication)

else

}return false;

}int

main()

;int

*duplication = new int(0

);int length =

sizeof

(numbers)

/sizeof

(numbers[0]

);duplicate

(numbers,length, duplication)

; cout<<

*duplication

}

時間複雜度o(n),空間複雜度o(1) 在輸入上進行操作,不額外分配空間

陣列中的數字都在0~ n-1的範圍內,如果沒有重複的話,那麼當陣列排序之後,數字i 將出現在下標為i 的位置上,如果陣列中有重複,那麼有些位置可能存在多個數字,利用這點來進行操作。

首先,重排這個陣列,從頭到尾進行掃瞄,當在第i 位時,我們先判斷這個數字(m)是不是等於i,如果是,那麼掃瞄下乙個數字,如果不是,則拿他和第m個數字進行比較,如果他和第m個數字相等,則找到了乙個重複數字(因為同時出現在第i,m位置),如果他和第m個數字不相等,就把他們交換。

# include

# include

# include

using namespace std;

bool duplicate

(int numbers,

int length,

int* duplication)

int temp = numbers[i]

; numbers[i]

= numbers[temp]

; numbers[temp]

= temp;}}

return false;

}int

main()

;int

*duplication = new int(0

);int length =

sizeof

(numbers)

/sizeof

(numbers[0]

);duplicate

(numbers,length, duplication)

; cout<<

*duplication

}

在乙個長度為n+1的陣列裡的所有數字都在1~n的範圍內,所以陣列中是少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如輸入長度為8的陣列 那麼輸出的重複數字是2或者3.

題目二看起來和題目一非常相似,但是不同的是,題目二中

明確規定不能修改輸入陣列,所以上面提到的交換法就不能再用。

和上面的雜湊表類似,只要逐一的複製原陣列的每個數字複製到輔助陣列(如果被複製的數字是m,則把它複製到輔助陣列中下表為m的位置),這樣就很容易的發現那個數字是重複的。但是該方法需要o(n)的輔助空間。

主要思想:

把1~n的數字 從中間的數字m分為兩部分,前面那一半為1~m, 後面一半為m+1~n。如果前一半(1-m)的數字總數超過了 m,那麼這一半的區間裡一定包含了重複的數字,否則,重複數字就在另一半的區間中。然後我們繼續對包含重複數字的區間一分為二,直到找到這個重複數字,其實這個方法和二分查詢類似,只是多了一步統計區間內數字個數。

# include

# include

# include

using namespace std;

intgetduplication

(const

int*numbers,

int length)}if

(lowcnt >

(mid - start +1)

)else

}return start;

}int

main()

;int length =

sizeof

(numbers)

/sizeof

(numbers[0]

);int duplication =

getduplication

(numbers,length)

; cout<<

"the duplication is : "

}

劍指offer 面試題3

思路 從左下角或者右上角開始比較 簡單版本 查詢方式從右上角開始查詢 如果當前元素大於target,左移一位繼續查詢 如果當前元素小於target,下移一位繼續查詢 進行了簡單的修改,可以判定輸入型別為字元的情況 查詢方式從左下角開始查詢 如果當前元素大於target,上移一位繼續查詢 如果當前元素...

劍指offer面試題3

前言 從最近的比賽中,真的可以看出來自己做題目太少了,一些常見的演算法,思路都不怎麼會,接下來要好好努力了 分析 書中給的分析思路很好,要解決乙個複雜的問題,最有效的方法就是從乙個具體的問題入手,這道題就可以舉例子,查詢7這個元素,首先從右上角開始,9比7大,所以9所在的列不會有,查詢8,比7大,所...

《劍指offer》陣列相關面試題

在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...