假设我有一个由n个数字组成的数组表示的序列。
是否可以通过n-1个比较来检查该序列是单调递增的,然后是单调递减的?
我尝试使用此链接How to determine if a sequence is bitonic?,但我认为它并不能帮助我解决问题。
答案 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
,但这是减少比较计数的基础。