タイトル説明
(1およびNを含む)デジタルである整数NUMSのN + 1つのアレイを考えるは、少なくとも1つの存在はnに1の整数を繰り返すことを見出しました。それだけの一意の整数を想定すると、繰り返しの数を見つけます。
実施例1:
入力:[1,3,4,2,2]
出力:2
例2:
入力:[3,1,3,4,2]
出力:3
説明:
元の配列を変更することはできません(配列を仮定が読み取られますA)。
(1)余分なスペースOのみを使用しています。
これは、O(N2)の時間計算量よりも少ないです。
数字の唯一の重複配列が、それは複数回繰り返してもよいです。
解決策1:フロイトのカメとウサギ(C ++)
これは、主な問題は、ループの入り口を見つけることです!!!のリストを取得する方法サイクルの入り口を考えることが必要です
リンクリストを含む環、リストのエントリのリングノードを見つけます
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int tortoise = nums[0];
int hare = nums[0];
while(1)
{
tortoise = nums[tortoise];
hare = nums[nums[hare]];
if(tortoise==hare) break;
}
int ptr1 = nums[0];
int ptr2 = tortoise;
while(ptr1 != ptr2)
{
ptr1 = nums[ptr1];
ptr2 = nums[ptr2];
}
return ptr1;
}
};
フロイトのカメとウサギ同様の質問:
対処方法2:二分法(パイソン)
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
left = 1
right = len(nums) - 1
while left < right:
mid = (left + right) // 2
cnt = 0
for num in nums:
if num <= mid:
cnt += 1
if cnt <= mid:
left = mid + 1
else:
right = mid
return left