尋找重複數

2021-10-06 15:23:32 字數 1218 閱讀 3595

leetcode演算法**題目

1.二分查詢 

//注意題目中的整數範圍1~len-1

//假設陣列中的元素已經排好了順序

//如果小於等於mid的個數大於mid的值,說明目標值在1~mid中間

//如果小於等於mid的個數小於mid的值,說明目標值在mid~right中間

class solution

return left;

}};

2.二進位制 

class solution

for (int bit = 0; bit <= bit_max; bit++)

//求1~n二進位制每一位的值

if (i >= 1 && (i & (1 << bit)))

}if (x > y)//如果當前二進位制位數上的x>y說明目標值二進位制模式當前位置應該是1

}return ans;

}};

3.快慢指標

第二個迴圈的,兩指標相遇在入口處的證明:

假設環長為 l,從起點到環的入口的步數是 a,從環的入口繼續走 b 步到達相遇位置,從相遇位置繼續走 c 步回到環的入口,則有 b+c=l,其中 l、a、b、c 都是正整數。根據上述定義,慢指標走了 a+b 步,快指標走了 2(a+b) 步。從另乙個角度考慮,在相遇位置,快指標比慢指標多走了若干圈,因此快指標走的步數還可以表示成 a+b+kl,其中 k 表示快指標在環上走的圈數。聯立等式,可以得到

2(a+b)=a+b+kl

解得 a=kl−b,整理可得

a=(k−1)l+(l−b)=(k−1)l+c

從上述等式可知,如果慢指標從起點出發,快指標從相遇位置出發,每次兩個指標都移動一步,則慢指標走了 a 步之後到達環的入口,快指標在環裡走了 k−1圈之後又走了 c 步,由於從相遇位置繼續走 c步即可回到環的入口,因此快指標也到達環的入口。兩個指標在環的入口相遇,相遇點就是答案。

class solution

while (slow != fast);

//上面的迴圈會使快慢指標在迴圈圈內相遇

slow = 0;

//慢指標移動到起點

while (slow != fast)

//第二個迴圈就是在尋找環的入口,入口就是目標值

return slow;

}};

尋找重複數

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

尋找重複數

給定乙個包含 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...

LeetCode 尋找重複數

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