每日一題 287 尋找重複數 20200526

2021-10-06 12:48:46 字數 1046 閱讀 5561

今天是2023年5月26日,星期二。

給定乙個包含 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) 。

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

在本題目中,使用「二分查詢」的方法來解決。使用「二分查詢」的前提:長度為n+1的陣列nums,陣列中每個值均在1~n之間(包括1和n)。注意說明4中,說明了一種極端情況:即陣列中所有元素為同乙個值。

由於本題目的特殊性,可以使用「二分查詢」來解決。由於所有元素值均在[1,n]之間。那麼其中位數為mid=(1+n)/2。我們遍歷整個陣列元素,拿每個元素的值與mid值相比,統計x<=mid值的個數為cnt。若cnt > mid值,則說明在區間[1,mid]之間存在重複的值,即重複的值位於1~mid之間,此時移動right=mid;反之則令left=mid+1

退出迴圈後必定有left == right,當前下標即為重複的資料。

說明:由於這個演算法是空間敏感的,「用時間換空間」是反常規做法,演算法的執行效率肯定不會高。

class solution 

}if (count > mid) else

}return left;

}}

時間複雜度:o(nlogn),二分查詢的時間複雜度為o(logn),由於在二分查詢中有乙個for迴圈複雜度為o(n),所以整體時間複雜度為o(nlogn)。

空間複雜度:o(1),僅使用了乙個count去記錄個數。

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 說明 不能更改原陣列 假...