18年拼多多面试-数组“山谷”

数组里的“山谷”是指一个数组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);
}

猜你喜欢

转载自blog.csdn.net/momo026/article/details/81159886
今日推荐