尋找重複數(二分查詢,快慢指標 ,二進位制)

2021-10-06 12:44:39 字數 1245 閱讀 3599

給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。

ps:不能更改原陣列(假設陣列是唯讀的)。

只能使用額外的 o(1) 的空間。

時間複雜度小於 o(

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

二分法(統計小於二分查詢字元的次數):

class solution:

def findduplicate(self, nums: list[int]) -> int:

n = len(nums)

left, right = 0, n - 1

while(left <= right):

mid = left + right >> 1

count = 0

for i in range(n):

count += nums[i] <= mid

if count <= mid:

left = mid + 1

else:

right = mid - 1

ans = mid

return ans

時間複雜度o(nlogn), 空間複雜度o(1) 

快慢指標(floyd 判圈演算法,快指標走兩步,慢指標走一步,如果有環他們總會相遇, 相遇後再將slow置零,兩個指標都變為一步,再次相遇的點就是答案):

class solution:

def findduplicate(self, nums: list[int]) -> int:

fast, slow = 0, 0

# 初始狀態

slow = nums[slow]

fast = nums[nums[fast]]

while(slow != fast):

slow = nums[slow]

fast = nums[nums[fast]]

slow = 0

while(slow != fast):

slow = nums[slow]

fast = nums[fast]

return slow

時間複雜度o(n), 空間複雜度o(1)

二進位制:類似於二分法的計數,這裡用來確定二分位上每一位重複是1還是0。

時間複雜度o(nlogn), 空間複雜度o(1)

LeetCode 287 尋找重複數 二分

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

287 尋找重複數 二分法 雙指標

簡單思路 1.return sum nums n n 1 2 2.set if num in set return num 用set 3.nums.sort if nums i nums i 1 return nums i 排序後 相同的數相鄰 本題思路 1.由於不能使用外部空間,並且時間複雜度 n...

287 尋找重複數 二分方法

給定乙個 n 1 個整數組成的陣列 nums,其數字都在 1 到 n 之間 包括 1,n 可知至少存在乙個重複的整數。題意 1 n個數本來該是n個數,組成n 1個數,則必然有重複數,找出重複數,而且題目假設只有乙個重複數,所以剩下的數要填滿1 n的數 使用二分方法,統計 mid的個數,如果左邊不重複...