我知道我的代码很乱,我很抱歉,我试图尽快写出来,而不是安排陈述。
适用于大多数情况,但不适用于{19,17,2,15,6,13,12,7,16,3,22}。
你可以看到它应该很简单,数组可以以任何方式排序,但偶数总是从开始到结尾增加,奇数减少。
我试图做的是定期二进制搜索,其中包含一些条件,以检查我们是否查看偶数或奇数,然后相应地进行调整。
编辑:我忘了提及它是一个我试图解决的问题,他们以最有效的方式特别指出搜索数组。
public static int find(int[] arr,int n)
{
final boolean EVEN;
if (n%2==0)
EVEN = true;
else
EVEN = false;
int min = 0, max = arr.length-1;
int m = 0;
do
{
m = (min+max)/2;
if (n == arr[m])
break;
if (arr[m]%2==0)
{
if (EVEN)
{
if (n>arr[m])
min = m+1;
else
max = m-1;
}
else
{
do
{
m--;
}
while(arr[m]%2==0);
if (arr[m]==n)
break;
if (n>arr[m])
max = m-1;
else
min = m+1;
}
}
else
{
if (!EVEN)
{
if (n>arr[m])
max = m-1;
else
min = m+1;
}
else
{
do
{
m++;
}
while(arr[m]%2!=0);
if (arr[m]==n)
break;
if (n>arr[m])
min = m+1;
else
max = m-1;
}
}
}while(min<max);
if (arr[m]==n)
return m;
else
return -1;
}
答案 0 :(得分:1)
尝试
while(min<=max);
您可能会错过最小和最大重合的情况。
<强>更新强>:
烨!我检查了一下。我针对
运行了你的程序int[] array = {19,17,2,15,6,13,12,7,16,3,22};
对于所有值,如果进行校正,它将按预期工作。