劍指offer 面試題3 陣列中的重複元素

2021-09-12 14:41:26 字數 909 閱讀 6993

面試題–【劍指offer】 題目解答

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

使用蠻力法,高額的時間代價是我們得不償失的,還可以想到使用雜湊表,通過構建輔助陣列,然後遍歷一遍陣列的元素即可,時間複雜度o(n),但是需要額外的o(n)輔助空間。

下面提出一種方法,在保證時間o(n)的基礎上,空間複雜度為o(1),我們叫交換元素法。因為長度為n的陣列裡的所有數字都在0到n-1的範圍內,正常沒有重複的情況下,我們可以把他們按照下標順序排成0,1,2…n-1的樣子。

演算法的主要思想:通過遍歷陣列元素,判斷當前陣列中的元素和陣列下標是不是一致的,如果不一致那麼就把當前元素放到下標屬於他的位置,在放置之前,我們要先判斷一下這兩個數是不是相等,如果相等的話,我們就找到了乙個重複元素,不相等的話直接交換即可。

// 採用交換法,time o(n), space o(1) 但是改變了陣列,

class solution

// 輸入合法的情況下 開始尋找重複元素,採用交換法

for(

int i =

0; i < length;

++i)

else

swap

(numbers[i]

,numbers[numbers[i]])

;}}return false;}}

;

交換元素法很顯然相比蠻力法和雜湊表法要高效,簡潔。但是需要注意的是,我們改變了陣列的結構,如果遇到題目不允許我們修改陣列結構的時候,我們可以借用二分查詢的方法來解答,具體的解法下個例子講~

劍指offer 面試題3

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

劍指offer面試題3

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

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

找出陣列中重複的數字 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。有幾個思路來解決這個問題 1.排序 這是最直接...