給定乙個包含 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的個數,如果左邊不重複...