如何检查大小为n的序列是否先通过n-1比较单调递增,然后单调递减

时间:2018-09-03 19:50:33

标签: arrays algorithm

假设我有一个由n个数字组成的数组表示的序列。

是否可以通过n-1个比较来检查该序列是单调递增的,然后是单调递减的?

我尝试使用此链接How to determine if a sequence is bitonic?,但我认为它并不能帮助我解决问题。

2 个答案:

答案 0 :(得分:1)

不确定这是否是家庭作业问题,因此这是一个花哨的/令人困惑的指针版本。 :-)

在数组元素n-1之间最多进行p个比较(&s[0]s[n-1]O(n))。

最多进行2n+1个比较。

int is_incdec(int *s, int n) {
    int *p = &s[0];
    int *last = &s[n-1];
    while (p != last && *p < *(p+1)) p++;
    while (p != last && *p > *(p+1)) p++;
    return p == last;
}

答案 1 :(得分:1)

为减少元素和测试数组范围内的比较总数,代码可以临时更改数组。

bool up_down(int *x, size_t n) {
  int right = x[n-1];
  x[n-1] = INT_MIN;
  int *up = x;
  while (up[0] < up[1]) {
    up++;
  }
  x[n-1] = right; // restore

  int left = x[0];
  x[0] = INT_MIN;
  int *down = x + n - 1;
  while (down[0] < down[-1]) {
    down--;
  }
  x[0] = left; // restore

  return up == down;

  // or per EOF comment to avoid a last "compare"
  return !(up - down);
}
  

是否可以通过n-1个比较来检查该序列是单调递增的,然后是单调递减的?

如果所有比较都算在内,我认为不是这样:上面的代码需要比n-1多一些(2?),并且在 n < 3 时效果不佳n < 2,但这是减少比较计数的基础。