注:本题解可能不唯一。如何查找所有解?
算法:设数组a[0...n-1],设有左右两个游标i,j。左游标右移过程中的最大值为max,右游标左移过程中的最小值为min。则当i==j时且min>=max,则有解,其中一解就是a[i]
算法是这样的:
1)初始化i = 0,j = n-1,max = a[0],min = a[n-1]
2)如果a[i] < max 则i++
3)如果a[j] > min 则j--
4)如果a[i] >= max 且a[j] <= min,则需要使i++或使j--
当a[i+1] <= min时,i++,并更新max;否则如果i++,就会造成左侧数大于右侧数无法求得解
当a[j-1] >= max时,j--,并更新min;否则由于此时的max可能已经被更新,如果j--就会造成右侧数小于左侧数,无法得解
由于当j - i == 1时上面两种情况不可能同时发生,因此避免了两个游标更新后造成j < i的问题,但是可能会出现上面两种情况均不发生的情形,此时说明j-i > 1,且max > min;此时需要对i进行回溯。
此种算法时间复杂度为O(n), 空间复杂度为O(n)。
PS:如果要获得所有满足条件的解,需另设置两个监测站,q1,q2,分别存储i和j最后一次跳变前得位置。所有满足条件的解即为(q1,q2)。不包括q1和q2