算法分析
1.貪心
2.switch狀态機
圖解
代碼
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int N;
int a[100];
static const int BEGIN = 0;
static const int UP = 1;
static const int DOWN = 2; //BEGIN UP DOWN 對應數值變化的三種狀态
int STATER = BEGIN;
int maximumNUM = 0;
int minimumNUM = 0;
int i;
int b[50],c[50];
printf("請輸入數組個數:");
scanf("%d",&N);
printf("請輸入數組元素:");
for(i = 0; i < N;i++){
cin >> a[i];
}
for(int i = 1;i < N;i++){
switch (STATER)
{
case BEGIN:
if(a[i-1]<a[i]){
STATER = UP;
}else if(a[i-1]>a[i]){
STATER = DOWN;
}
break;
case UP: //已知a[i-1]是升序得到,若a[i]>a[i-1],則為遞增,不是極值
if(a[i-1]>a[i]){
STATER = DOWN; //尋找折點
b[maximumNUM] = a[i-1];
maximumNUM++;
}
break;
case DOWN:
if(a[i-1]<a[i]){
STATER = UP;
c[minimumNUM] = a[i-1];
minimumNUM++;
}
break;
}
}
printf("極大元個數:%d\n",maximumNUM);
printf("極大元為:");
for(i=0;i<maximumNUM;i++){
cout << b[i]<<" ";
}
cout<<endl;
cout <<"----------------"<<endl;
printf("極小元個數:%d\n",minimumNUM);
printf("極小元為:");
for(i=0;i<minimumNUM;i++){
cout << c[i]<<" ";
}
cout<<endl;
cout <<"----------------"<<endl;
sort(a,a+N);
printf("最小值:%d\n",a[0]);
printf("最大值:%d\n",a[N-1]);
system("pause");
}