在数组中查找魔术索引的结束条件

时间:2015-07-24 20:12:28

标签: arrays algorithm dynamic-programming binary-search

我在解决方案中有一个问题,我提到了以下问题

  

数组A [l .. .n-l]中的魔术索引被定义为索引   A [i] = i。给定一个不同整数的排序数组,写一个   在数组A中查找魔术索引(如果存在)的方法。

我提到的解决方案看起来像。假设'代表开始,并且' e'代表结束。

int fun(int a[], int s, int e)
{
 if(s > e || s < 0 || e >= array.length)
  return -1;

 mid = (s + e)/2;

 if(mid == a[mid])
  return mid;
 else if(mid < a[mid])
  return fun(a, s, mid-1);
 else 
  return fun(a, mid+1, e); 
}

我不确定这里的结局情况。

我觉得结局条件应该是

if(s > e)
 return -1;

让我们考虑魔法指数不存在时的两种极端情况

CASE 1 - going left till index 0
Say the array looks as follows a[] = {2,10,20,30,40,50}

mid = (0+6)/2 = 3 , call fun(0,2)
mid = (0+2)/2 = 1 , call fun(0,0)
mid = (0+0)/2 = 0 , call fun(0,-1)
since start > end, -1 is returned

CASE 2 - going right till the last element
Say the array looks as follows a[] = {-20,-10,-5,-4,-3,30,80}

mid = (0+6)/2 = 3 , call fun(4,6)
mid = (4+6)/2 = 5 , call fun(6,6)
mid = (6+6)/2 = 6 , call fun(7,6)
since start > end, -1 is returned

此外,我觉得解决方案中给出的额外条件永远无法达到。

  • 我觉得s&lt; 0无法联系到,因为我们永远不会从中减去任何东西。&#39;我觉得最小的价值是&#39;可能是0.也许&#39; e&#39;可以&lt; 0,但不是&#39;
  • 我觉得e&gt; = array.length是不可能的,因为我们永远不会添加任何东西到&#39; e。也许&#39; s&#39;可以大于或等于array.length但不是&#39;

1 个答案:

答案 0 :(得分:1)

你是对的&e;足够了。 S永远不会低于零,因为它要么保留要么等于(s + e)/ 2 + 1> = s + 1(因为e> = s),所以它总是大于或等于通过的初始值,即零。类似地,可以总是显示e <= n-1,因此额外条件是多余的。