給定乙個包含 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) 。
陣列中只有乙個重複的數字,但它可能不止重複出現一次。
我們先假設乙個如果排序好的陣列中,你如果取中間的數字,那麼如果你的這個中間數 是要比當前的索引的座標大的話,那麼就是也就是nums[i] > i
,那麼就是說明那個重複的數字是在後半部分的,因為只有在後半部分有重複數字存在的時候,才會多出乙個數字來,那麼我們就用二分法,把start取到中點位置,繼續尋找;反之,那個重複的數字是在前半部的。
因為我們這陣列是沒排序的陣列,那麼我們根據上面的那個計數的思想,我們先取乙個取值範圍,如果陣列裡面的所有元素,看取值在這個取值範圍的元素個數,等於這個取值範圍的區間,那麼就表示這個取值範圍內不存在重複元素,我們要取別的區間的,繼續計數。
class solution else
}// 區間就是 中值- 開始值 + 1。然後開始和計數比較。
int range = middle - start + 1;
if (tempcount > range) else if (tempcount <= range)
}return -1;
}// 計數比較,時間複雜度為o(n)
private int countrange(int nums, int start, int end)
}return count;
}}
以上的時間複雜度是$o(nlogn)$ ,二分的時間複雜度是$o(logn)$,每次計數的時間複雜度是$o(n)$。 LeetCode 尋找重複數
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重...
LeetCode 尋找重複數
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用...
LeetCode 尋找重複數
題目 給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2 示例 2 輸入 3,1,3,4,2 輸出 3 說明 不能更改原陣列 假設陣列是唯讀的...