leetcode 尋找重複數

2021-10-07 12:09:26 字數 1214 閱讀 9979

給定乙個包含 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 說明 不能更改原陣列 假設陣列是唯讀的...