一尘不染

如何在线性时间中按升序找到3个数字并按数组增加索引

algorithm

我在一个网站上遇到了这个问题。正如那里提到的,在亚马逊采访中有人问过。在给定的约束下,我找不到合适的解决方案。

给定一个n整数数组,找到 3个 这样的 元素a[i] < a[j] < a[k]i < j < kO(n) 时间内。


阅读 169

收藏
2020-07-28

共1个答案

一尘不染

因此,这是解决问题的方法。您需要遍历数组三次。在第一个迭代中,将标记元素大于其所有值的所有值标记在右边,在第二个迭代中,将标记所有小于它们的元素的值标记在左侧。现在,您的答案将是同时具有两个元素:

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次,因此是线性的。我没有提供完整的解决方案,因此您可以在左边训练自己,以了解您是否了解我的想法。很抱歉,我只给出一些提示,但是我不知道如何给出提示而不显示实际解决方案。

希望这能解决您的问题。

2020-07-28