编程小练习3:数组SmallLarge
2014-07-22 20:56
183 查看
题目:一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,其右边的数都大于等于它。
方法一:
最原始的方法是检查每一个array[i],看是否左边的数都小于等于它,右边的数都大于等于它。这样的话,要找出所有这样的数,时间复杂度为O(n的平方)
方法二:
有更简单的方法,但需要使用额外数组,比如使用RightMin[i]来记录数组array[i]右边(包括自己)的最小值。
有了这样一个额外数组,当我们从头开始遍历原始数组时,我们保存一个当前最大值LeftMax,如果当前最大值刚好等于RightMin[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; }
相关文章推荐
- 编程练习-螺旋数组
- 第6章_数组_编程练习_Exercise6_19(成绩排名)
- C语言编程(练习2:字符串与字符串数组)
- 【openjudge 计算概论(A)】[编程练习(数组练习)]
- 编程练习:合并两个数组(包括三种快排程序)
- 编程练习——求无序数组第k小的数
- C Primer Plus 第10章 数组和指针 编程练习
- C语言编程(练习8:数组与指针)
- C语言编程(练习6:数组与指针)
- c++ primer plus 第五版 第七章 编程练习 第 8 题 (字符数组转成字符串,trim使用,判断空行)
- 第6章_数组_编程练习_Exercise6_25(二维数组的相乘)
- 编程小练习2:数组乘积
- 【编程练习】将string容器保存在字符指针数组中
- C语言编程(练习9:数组与指针)
- C语言编程(练习3:数组与指针)
- 第6章_数组_编程练习_Exercise6_5
- 《C Primer Plus 第五版》第十章(数组和指针)编程练习
- C语言编程(练习1:数组和指针)
- C Primer Plus (第五版) 第十章 数组和指针 编程练习
- C语言编程练习——字符串数组的冒泡排序,从小到大