数组里的“山谷”是指一个数组A汇总的连续子数组B满足一下条件:1)B.length>=3; 2)存在满足:0<i<B.length-1并且B[0]>B[1]>...B[i-1]>B[i]<B[i+1]<...<B[B.length-1];(B可以是A的子数组或者等于A)
给定一个数组A,找出数组A里的最长“山谷”B的长度,如果没有,则输出0。
输入描述:
每个测试输入包含一个测试用例,即给出整形数组A,这里保证0<=A.length<=10000,并且0<=A[i]<=10000
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;
void main()
{
/*int A[9] = {4,3,21,5,3,1,4,8,0};*/
int A[8] = { 4, 3, 2, 5, 3, 1, 4, 8 };
//int ln;
//cin >> ln;
//for (int i = 0;i<ln; i++)
// cin >> A[i];
int length = sizeof(A) / sizeof(A[0]);
int ln = length;
//int length = sizeof(A) / sizeof(A[0]);
printf("length=%d\n", length);
int c[10000];//存放局部极小值的下标
int j = 0;
//寻找若干个局部最小值,其中i为局部最小值的下标;
for (int i = 0; i < ln; i++)
{
if ((i!= 0)&&(i!=ln-1))
{
if ((A[i]<A[i-1])&&(A[i]<A[i + 1]))//逻辑运算符与&& //按位运算符 &
{
c[j++] = i;
}
}
}
printf(" j当前值为=%d\n", j);
printf(" 山谷极小值下标=%d\n", c[0]);
int max = 0;
int max1;
int m;
int n;
if (j>=1)//判断是否存在山谷
{
//判断每一个山谷的长度
//定义max为数组长度
for (int k = 0; k < j; k++)
{
int f = c[k];
m = f;// 从f开始而不是从f-1开始,防止出现f=1的情况
n = f;
while (A[m]<A[m-1])
{
m--;
if (m<=0)//防止超下边界,必须是小于等于,小于号变成-1后会继续运行;
break;
}
while (A[n]<A[n + 1])
{
n++;
if (n >= ln-1)//防止超上边界,必须是大于等于,否则超边界后会继续运行;
break;
}
max1 = n + 1- m;
printf("f=%d\tm=%d\tn=%d\tmax1=%d\n", f, m, n,max1);
if (max1>max)
{
max = max1;
}
}//endoffor (int k = 0; k < j; k++)
}//end of if (j>=1)
printf("max=%d\n", max);
while (1);
}