question:
给定一个数组A,找出A[p]>=A[q] 中 p-q的最大值。
要求O(n)的时间和空间复杂度
answer1:
计算数组b,使得b[j]为A[j...n-1]的最大值。那数组就是一个递减的数组。
遍历A数组,当A[i]<b[j]时,说明在j...n-1之间有k使得A[j]<A[k]。那找到最小的j使得A[i]>b[j],这样找到如果q为i时的最大差值为j-i-1。
这样仍旧为双层循环不满足空间复杂度。
这里我们发现,如果i1和j1满足条件时,即差值为j1-i1-1。这时如果i再增加,j如果减少也不再满足j-i-1>j1-i1-1.
所以j是没有必要减小的。
这样的复杂度就可以变现成O(n)
#include<iostream>
using namespace std;
int main(){
int n;
int a[1000],b[1000];
cin>>n;
for(int i = 0;i<n;i++)cin>>a[i];
for(int j = n-1;j>=0;j--)b[j] = (j+1<n &&b[j+1]>a[j]) ?b[j+1]:a[j];
int ans=0,j=0;
for(int i=0;i<n;i++){
for(;j<n;j++){
if (b[j]>=a[i])continue;
else break;
}
ans = max(ans,j-i-1);