查找数组中最大数字的有效方法

时间:2011-07-19 04:31:21

标签: c++ algorithm

这是一个面试问题 有一个整数数组。数组中的元素可以遵循以下模式。

  1. 数字按升序排列
  2. 数字按降序排列
  3. 数字开头增加,最后减少
  4. 数字开头减少,最后增加
  5. 查找数组中最大数字的有效方法是什么?

8 个答案:

答案 0 :(得分:9)

在这种情况下,您需要做的就是确定它是否为(3)。如果没有,答案是max(first,last)。

在所有元素相同的情况下,您需要彻底搜索数组以显示中间某处没有一个高数字。所以我认为确定你是否在(3)中是O(n)。

答案 1 :(得分:5)

嗯,你有个案

  1. 最后一个号码。
  2. 第一个号码。
  3. 从头到尾移动,在第一次下降时停止并打印上一个号码。
  4. 比较第一个和最后一个数字。
  5. 如果您不知道自己处于哪种情况,那么您可以通过执行以下操作(在C类伪代码中)找到最大值时对此进行测试:

    for (int i=0; i<end; ++i) {
        if (array[i] < array[i+1]) {
            // CASE 1 or 3
            for (int j=i+1; j<end; ++j) {
                if (array[j] > array[j+1]) {
                    // CASE 3
                    return array[j];
                }
             }
             // CASE 1
             return array[end];
         }
    }
    // CASE 2 or 4
    return max(array[0],array[end]);
    

答案 2 :(得分:2)

通过检查前两个元素和最后两个元素,您将能够确定数组的类型

  1. 这是最后一个元素
  2. 这是第一个元素
  3. 见下文
  4. 它是第一个和最后一个元素中较大的一个
  5. 对于3,首先查看数组中间的两个元素,如果它们仍在增加,则数组中的最大值更高,如果它们正在减小,则数组中的最大值更低。以binary search方式重复

答案 3 :(得分:2)

由于情况1-3都有一个峰值(两侧的值都低于它自身或数组边缘的值),而情况4在数组的两端都有两个峰值,这个问题可以解决相当简单地在所有情况下O(log n)时间:

首先,应用1D峰值发现算法在阵列中找到峰值。

如果峰值出现在数组的中间(不是第一个或最后一个位置),则情况为#3,峰值也是最大值。

如果峰值是数组的第一个或最后一个元素,那么这是情况1,2或4中的一个,并且数组max是max(first,last)。

Python-esque伪代码:

def find-peak(list):
    mid=len(list)/2
    if (list[mid-1] > list[mid]:
        return find-peak(list[:mid-1])
    else if (list[mid+1] > list[mid]:
        return find-peak(list[mid+1:])
    else:
        return mid

def find-max(list):
    peak = find-peak(list)
    if peak==0 or peak==len(list)-1:
        return max(list[0], list[-1])
    else:
        return list[peak]

答案 4 :(得分:0)

1.最后一个号码 2.第一个号码 3.do二次搜索,选择一个支点,计算斜率,然后决定接下来左或右 4.第一个或最后一个号码

答案 5 :(得分:0)

如果我们假设序列没有重复数字,那么识别这四种情况的方法是直截了当的:

case 1: arr[0] < arr[1] && arr[end-1] < arr[end]
case 2: arr[0] > arr[1] && arr[end-1] > arr[end]
case 3: arr[0] < arr[1] && arr[end-1] > arr[end]
case 4: arr[0] > arr[1] && arr[end-1] < arr[end]

正如其他答案中所提到的,找到最大值的方法也是直截了当的:

case 1: arr[end]
case 2: arr[0]
case 3: binary search, until found n that arr[n-1] < arr[n] > arr[n+1]
case 4: max(arr[0],arr[end])

答案 6 :(得分:0)

答案取决于“效率”的含义。如果你想要快速代码,请查看其他人的答案。如果你想成为一名程序员,你应该只使用一个库调用(比如C ++中的max_element()。)

答案 7 :(得分:0)

这个问题让我想起Golden section algoritm找到最小的单模(即:减少然后增加)函数。它是一种二进制搜索的加强版本,可以在尽可能少的点上计算函数的值(即:检查数组)。

现在你需要做的就是将它翻译成一个离散的版本并添加额外的口哨以确定函数是凹的还是凸的。