首先 O(n^2)的暴力枚举是肯定正确的,只是时间复杂度太高。
我们把一对元素中,靠前的元素叫做头,后面的叫做尾。
为了让距离最大,我们考虑哪些元素可以当作这对元素的头?假如 ai 可以作为最优结果的头元素,那么需要保证, ai之前的元素,都大于 ai,否则如果存在 aj<ai(j<i) ,那么 aj 同 ai的尾也是可以组成一对元素的,并且距离更大。
同理可以作为尾的元素,他的后面也不会存在比他更大的元素。因此使用单调队列,可以求出所有可以作为尾的元素,反向再做一次,可以求出能够作为头的元素。对于这两部分元素,做一次归并排序,互相配对,再统计配对后的最大距离就是答案,复杂度 O(n)。
注:本题虽然可以用单调栈或单调队列来做,但不用拘泥于这两部分知识,普通的 vector 就可以满足我们的要求