尋找重複數(力扣第287題)

2022-06-16 11:24:11 字數 1587 閱讀 2632

​ 給定乙個包含n+1個整數的陣列 nums,其數字都在1到n之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。

示例 1:

輸入: [1,3,4,2,2]

輸出: 2

示例 2:
輸入: [3,1,3,4,2]

輸出: 3

說明:

不能更改原陣列(假設陣列是唯讀的)。

只能使用額外的 o(1) 的空間。

時間複雜度小於 o(n2) 。

陣列中只有乙個重複的數字,但它可能不止重複出現一次。

分析:​ 該題要求相當苛刻,陣列是唯讀的,不能使用額外空間,那麼借助雜湊表的方法也就不行了,時間複雜度則要求不能使用暴力法,陣列中只有乙個重複的數字,但是這個重複出現的數字可能不止重複一次。

​ 一開始做起這個題也沒有頭緒,所以也參考了其他人的解法,主要使用的是二分法和快慢指標。

​ (1)二分法

​ 這個陣列乍一看,並不是乙個有序陣列,並不能直接使用二分法,但是經過一些處理,就能造出乙個公升序陣列出來。首先明確一點,該陣列一共有n+1個元素,這些元素值都在1-n之間,那麼我們可以定義乙個陣列count[i],用於記錄給定陣列中小於等於i的元素個數,其中1=​ 對於原陣列中在[1,targrt-1]區間內的元素來說,其滿足 count[i] <=i;

​ 對於原陣列中在[target,n]區間內的元素來說,其滿足 count[i] > i;

​ 解釋一下為啥是count[i] <= i,如果原陣列中重複的元素只出現兩次,因為原陣列的大小是n+1,那麼1-n這個範圍內的所有元素都會出現,所以此時count[i] ==i;如果原陣列中重複出現的元素出現的次數大於兩次,那麼1-n這個範圍內有的元素並不會出現,不會出現的元素可被認為由重複元素替代了,對於不會出現的元素分為兩種情況:

​ (1)沒出現的元素i位於[1,targrt-1]內,那麼[i+1,targrt-1]區間內的元素k對應的count值應該都減去1,此時就是count[k] < k了;

​ (2)沒出現的元素j位於[target,n]內,那麼[target,j-1]區間內的元素k對應的count值都應該加上1,此時也滿足count[k]>k了;

​ 比如,上面的示例2,[3,1,3,4,2],其count與nums值的對應關係如下:

nums12

34count12

45​ 我們要找的就是上面這個表中,第乙個count[i] > i的那個值,這個值就是重複值。

​ 相當於原始陣列的元素值作為count值的索引(1-n),然後對count陣列進行二分查詢,尋找第乙個count值大於其索引值的的那個元素,這元素的count索引值就是最終的結果。

實現**:

public int findduplicate2(int nums) 

}if ( count <= mid )else

}return left;

}

題解 - 陣列與矩陣.md#5-有序矩陣的-kth-element

287 尋找重複數 力扣(LeetCode)

給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用...

LeetCode第287題尋找重複數

題目 題目描述 給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2 示例 2 輸入 3,1,3,4,2 輸出 3 說明 不能更改原陣列 假設陣...

力扣 尋找重複數

給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。不能更改原陣列 假設陣列是唯讀的 只能使用額外的 o 1 的空間。時間複雜度小於 o n2 陣列中只有乙個重複的數字,但它可能不止重複出...