CVTE笔试题,查找左边元素最少的分段,要求都比右边分段元素 小或等于

CvTe笔试题:
1、读入一个不定长数组,将其分不打乱顺序分为两段left 和right
要求:
1、分段中left 段中元素 都 比right段中元素 小或等于
2、不打乱元素顺序
3、空间复杂度0(1)
4、输入数据为以空格分段的整数:

  输入示例:
  5 0 3 8 6
  输入示例:
  3
  解释:5 0 3  都比 8 6小

2、解题思路
1、从左边第一个元素开始分段遍历
左段(5) 又段(0 3 8 6)
left 最大 为5 right 最小为 0
2、判断left段中的最大元素 与 right段中的最小元素
if(max <= min )则找到了left段元素都小于right段的 元素最少的分段
没找到则继续二分 left段 和 right段
3、返回res (为分段的下标) 即为所求

#include 

using namespace std;

//找到前一分段中的最大值
int findmax(int* arr, int left, int right)
{
	int max = arr[left];
	while (left < right)
	{
		if (max < arr[left + 1])
			max = arr[left + 1];
		left++;
	}
	return max;
}

//找到后一分段的最大值
int findmin(int* arr, int left, int right)
{
	int min = arr[left];
	while (left < right)
	{

		if (min > arr[left + 1])
			min = arr[left + 1];
		left++;
	}
	return min;
}

//比较两个分段max,min,如果max大于min 则分段不成立,返回0
int ret(int* arr, int left, int mid, int right)
{
	int max = findmax(arr, left, mid - 1);
	int min = findmin(arr, mid, right);

	if (min >= max)
	{
		return mid;
	}
	else
	{
		return 0;
	}
}

int main()
{
	int n;
	int arr[10001];

	//cin >> n;
	//for (int i = 0; i < n; i++)
	//{
	//	cin >> arr[i];
	//}
	int i;
	for (i = 0; ; i++)
	{
		cin >> arr[i];
		if (getchar() == '\n')
			break;
	}

	n = i+1;
	//开始n-1次遍历分组,取得前后段比较返回值,为1则可以分组。count++
	int left = 0;
	int right = n - 1;
	int count = 1;
	int res;
	for (int i = 1; i < n; i++)
	{
		res = ret(arr, left, i, right);
		if (res != 0)//说明找到l , 就不需要继续进行分段了
		{
			break;
		}

	}

	cout << res << endl;
	system("pause");
	return 0;
}

你可能感兴趣的:(简单算法题)