题目描述:在一个长度为n+1的数组里所有数字都在1~n的范围内,所以数组中至少有一个数是重复的。请找出数组中任意一个重复的数,但不能修改输入的数组。
分析:重复的数一定在某范围内,我们可以逐渐缩小范围,直到找到重复的数。
代码如下:
public sealed class ErfenAndFind
{
public static int one = -1;
public static void Find(int[] arr,int start,int end)
{
//递归出口
if(start>=end)
{
one = arr[start];
return;
}
int count = 0;
int len = (start + end) / 2;
for(int i=0;i<arr.Length;i++)
{
if (arr[i] <= len )
count++;
}
if(count>(len-start+1)) //这里需要注意
{
end = len;
Find(arr, start, end);
}
else
{
start = len+1;
Find(arr, start, end);
}
}
}总结:主要考虑怎么写看起来思路清晰。
本文介绍了一种在不修改原始数组的情况下寻找重复数字的方法。通过递归二分查找的方式逐步缩小重复数字可能存在的范围,最终定位到具体数值。此方法适用于长度为n+1的数组,其中所有数字都在1~n的范围内。
1659

被折叠的 条评论
为什么被折叠?



