找到数组中的最大元素,该元素首先增加然后减少

时间:2016-12-03 15:20:42

标签: c algorithm data-structures binary-search

我制作了一个代码并编译为下面的输入它是正确的  如

 Input: arr[] = {8, 10, 20, 80, 100, 200, 400, 500, 3, 2, 1}

输出:500

 Input: arr[] = {1, 3, 50, 10, 9, 7, 6}

输出:50

int findIncre_Decre(int arr[], int low, int high)
  {
        if (low == high)
        return arr[low];

       /* If there are two elements and first is greater then
          the first element is maximum */
         if ((high == low + 1) && arr[low] >= arr[high])
                return arr[low];

         /* If there are two elements and second is greater then
             the second element is maximum */
             if ((high == low + 1) && arr[low] < arr[high])
                 return arr[high];

               int mid = (low + high)/2; /*low + (high - low)/2;*/

          /* If we reach a point where arr[mid] is greater than both of
           its adjacent elements arr[mid-1] and arr[mid+1], then arr[mid]
            is the maximum element*/
       if ( arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1])
            return arr[mid];

       if (arr[mid] > arr[mid + 1] && arr[mid] < arr[mid - 1])
         return findIncre_Decre(arr, low, mid-1);
         else 
        return findIncre_Decre(arr, mid + 1, high);
   }

但它不适用于

输入: - arr [] = {7,8,9,10,15,5,16}  预期输出: - 15但我得到答案16而不是15。

任何想法都将受到赞赏。

提前致谢。

2 个答案:

答案 0 :(得分:2)

为什么要起作用?您编写代码时假设数组可以分为两部分:一个增加部分,一个减少部分。这个测试用例打破了前提条件。

您可以检查数组是否有效,但在最坏的情况下,它需要线性扫描。最好只检查每个元素以找到最大的元素。

例如,检查输入是否正确并不总是好的。对于这个特殊问题,如果要在O(logN)中求解,则必须假设输入正确。

编辑:为了公平起见,此答案已经过编辑。在原始答案中,我向OP提供了一个测试用例,以帮助他们找到代码失败的位置,但我的测试用例也无效。)

答案 1 :(得分:0)

正如@Rafael Giusti在编写程序时所说,我们也必须尝试捕获无效输入。

我已经为错误处理问题添加了解决方案(无效情况下数组中的最大元素)。上述问题可以通过

来解决
  1. 通过线性搜索(取O(n))
  2. 通过二分搜索(采用O(longn))
  3. 线性方法

    1.这是无效输入我在数组中抛出最大元素

    2.对于这个问题,我们在数组中至少需要三个元素

    注意:我只是检查边缘情况(数组中少于三个元素,数组按升序排列,数组按降序排列)。您可以完全迭代数组以检查给定数组是否满足条件 - 首先增加 - 然后减少,我没有在下面的程序中检查 - 如果不满足边缘情况,我只返回数组中的最大元素

    int findElement(int arr[], int low, int high) {
         if(low < 0 || low >= high || low+1 == high) return (arr[low] < arr[high] ? arr[high] : arr[low];
         int max = arr[low];
         for(int i=low+1; i<=high-1 && low-1 <= high; i++) {
             max = arr[i] > max ? arr[i] : max;
             if(arr[i-1] < arr[i] && arr[i] > arr[i+1]) 
                return arr[i];   //Perfect match !!
         }
        return max;    // We haven't found any element 
    }
    

    二进制搜索方法

    注意:在无效输入的数组情况下返回最大值

    int findElement(int arr[], int low, int high) {
         if(high < low) return arr[low];
         if(high-low < 2) return (arr[low] > arr[high]) ? arr[low] : arr[high];     
         int mid = (low + high)/2;
         int left = findElement(arr, low, mid-1);
         int right = findElement(arr, mid+1, high);
         return (left < arr[mid]) && (right < arr[mid]) ? arr[mid] : (left > right ? left : right);
    }