编程小练习3:数组SmallLarge

来源:互联网 发布:人工智能的发展进程 编辑:程序博客网 时间:2024/05/21 08:55

题目:一个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];elseRightMin[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;}


0 0