287 尋找重複數

2021-10-05 16:46:39 字數 2388 閱讀 3552

給定乙個包含 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, 2, 2, 3, 4, 5, 6, 7] 為例,一共 8 個數,n + 1 = 8,n = 7,根據題目意思,每個數都在 1 和 7 之間。

例如:區間 [1, 7] 的中位數是 4,遍歷整個陣列,統計小於等於 4 的整數的個數,至多應該為 4 個。換句話說,整個陣列裡小於等於 4 的整數的個數如果嚴格大於 4 個,就說明重複的數存在於區間 [1, 4],它的反面是:重複的數存在於區間 [5, 7]。

於是,二分法的思路是先猜乙個數(有效範圍 [left, right]裡的中間數 mid),然後統計原始陣列中小於等於這個中間數的元素的個數 cnt,如果 cnt 嚴格大於 mid,(注意我加了著重號的部分「小於等於」、「嚴格大於」)依然根據抽屜原理,重複元素就應該在區間 [left, mid] 裡。

class

solution

if(count > mid)

right = mid-1;

else

left = mid+1;

}return left;}}

;

複雜度分析:

時間複雜度:o(nlogn),二分法的時間複雜度為 o(logn),在二分法的內部,執行了一次 for 迴圈,時間複雜度為 o(n),故時間複雜度為 o(nlogn)。

空間複雜度:o(1),使用了乙個 cnt 變數,因此空間複雜度為 o(1)。

先看141. 環形鍊錶——判斷是否有環

給定乙個鍊錶,判斷鍊錶中是否有環。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

};再看142: 環形鍊錶 ii——找環的起點

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

說明:不允許修改給定的鍊錶。

思路

class

solution

return fast;}}

return

null;}

};

最後再細品本題:尋找重複數

對於陣列中的每個元素,可以將它們看作next結點;

從理論上講,陣列中如果有重複的數,那麼就會產生多對一的對映,這樣,形成的鍊錶就一定會有環路了,

綜上1.陣列中有乙個重複的整數 鍊錶中存在環

2.找到陣列中的重複整數 找到鍊錶的環入口

至此,問題轉換為142題。那麼針對此題,快、慢指標該如何走呢。根據上述陣列轉鍊錶的對映關係,可推出

142題中慢指標走一步slow = slow.next ——> 本題 slow = nums[slow]

142題中快指標走兩步fast = fast.next.next ——> 本題 fast = nums[nums[fast]]

class

solution

//找到環,將慢指標返回起點,快慢指標同步前進,

//再次相遇時,就是環的入口,即本題的而重複數

slow =0;

while

(slow != fast)

return slow;}}

;

287 尋找重複數

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

287 尋找重複數

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

287 尋找重複數

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