题目:一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,其右边的数都大于等于它。
方法一:
最原始的方法是检查每一个array[i],看是否左边的数都小于等于它,右边的数都大于等于它。这样的话,要找出所有这样的数,时间复杂度为O(n的平方)
方法二:
有更简单的方法,但需要使用额外数组,比如使用RightMin[i]来记录数组array[i]右边(包括自己)的最小值。
有了这样一个额外数组,当我们从头开始遍历原始数组时,我们保存一个当前最大值LeftMax,如果当前最大值刚好等于RightMin[i],那么这个最大值一定满足条件。
代码:
#include <iostream>
using namespace std;
//方法一
//检查每一个array[i],看是否左边的数都小于等于它,右边的数都大于等于它
//时间复杂度为O(n2)
void SmallLarge(int *arr,int n)
{
int i,j,flag;
for(i=0;i<n;i++)
{
flag=1;
for(j=0;j<n;j++)
{
if(j<i&&arr[j]>arr[i])
{
flag=0;
break;
}
else if(j>i&&arr[j]<arr[i])
{
flag=0;
break;
}
else
{
}
}
if(flag)
cout<<arr[i]<<' ';
}
}
//方法二
void SmallLarge2(int *arr,int n)
{
int k,LeftMax;
int *RightMin = new int[n];
RightMin[n-1] = arr[n-1];
for(k=n-2;k>=0;k--)
{
if(arr[k]<RightMin[k+1])
RightMin[k] = arr[k];
else
RightMin[k] = RightMin[k+1];
}
LeftMax = arr[0];
for(k=0;k<n;k++)
{
if(arr[k]>=LeftMax)
LeftMax = arr[k];
if(LeftMax == RightMin[k])
cout<<arr[k]<<' ';
}
}
int main()
{
int n,i;
cin>>n;
int *array = new int[n];
for(i=0;i<n;i++)
cin>>array[i];
SmallLarge(array,n);
cout<<endl;
SmallLarge2(array,n);
delete []array;
return 0;
}