我在一个网站上遇到了这个问题。正如那里提到的,在亚马逊采访中有人问过。在给定的约束下,我找不到合适的解决方案。
给定一个n整数数组,找到 3个 这样的 元素 ,a[i] < a[j] < a[k]并i < j < k在 O(n) 时间内。
n
a[i] < a[j] < a[k]
i < j < k
因此,这是解决问题的方法。您需要遍历数组三次。在第一个迭代中,将标记元素大于其所有值的所有值标记在右边,在第二个迭代中,将标记所有小于它们的元素的值标记在左侧。现在,您的答案将是同时具有两个元素:
int greater_on_right[SIZE]; int smaller_on_left[SIZE]; memset(greater_on_rigth, -1, sizeof(greater_on_right)); memset(smaller_on_left, -1, sizeof(greater_on_right)); int n; // number of elements; int a[n]; // actual elements; int greatest_value_so_far = a[n- 1]; int greatest_index = n- 1; for (int i = n -2; i >= 0; --i) { if (greatest_value_so_far > a[i]) { greater_on_right[i] = greatest_index; } else { greatest_value_so_far = a[i]; greatest_index = i; } } // Do the same on the left with smaller values for (int i =0;i<n;++i) { if (greater_on_right[i] != -1 && smaller_on_left[i] != -1) { cout << "Indices:" << smaller_on_left[i] << ", " << i << ", " << greater_on_right[i] << endl; } }
该解决方案在整个数组上迭代3次,因此是线性的。我没有提供完整的解决方案,因此您可以在左边训练自己,以了解您是否了解我的想法。很抱歉,我只给出一些提示,但是我不知道如何给出提示而不显示实际解决方案。
希望这能解决您的问题。