您的位置:首页 > 编程语言

编程小练习3:数组SmallLarge

2014-07-22 20:56 183 查看
题目:一个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
;
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
;
for(i=0;i<n;i++)
cin>>array[i];
SmallLarge(array,n);
cout<<endl;
SmallLarge2(array,n);

delete []array;
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组