今天是2023年5月26日,星期二。
給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。
示例 1:
示例 2:輸入: [1,3,4,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
,當前下標即為重複的資料。
說明:由於這個演算法是空間敏感的,「用時間換空間」是反常規做法,演算法的執行效率肯定不會高。
時間複雜度:o(nlogn),二分查詢的時間複雜度為o(logn),由於在二分查詢中有乙個for迴圈複雜度為o(n),所以整體時間複雜度為o(nlogn)。class solution
}if (count > mid) else
}return left;
}}
空間複雜度: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 說明 不能更改原陣列 假...