牛牛排序子序列

1、排序子序列 牛牛定义排序子序列为一个数组中一段连续的子序列, 并且这段子序列是非递增或者非递减排序的。 牛牛有一 个长度为n的整数数组A, 他现在有一个任务是把数组A分为若干段排序子序列, 牛牛想知道他最少可以把这个数 组分为几段排序子序列.如样例所示, 牛牛可以把数组A划分为[1, 2, 3]和[2, 2, 1]两个排序子序列, 至少需要划分为2个排序子序列
2、输入描述: 输入的第一行为一个正整数n(1 ≤ n ≤ 10 ^ 5) 第二行包括n个整数A_i(1 ≤ A_i ≤ 10 ^ 9), 表示数组A的每个数字。

3、输出描述: 输出一个整数表示牛牛可以将A最少划分为多少段排序子序列

4、示例: 输入 6 1 2 3 2 2 1 --> 1 1 2 2 2 3 输出 2 ------牛客网

分析题目:

题目的要求是按照输入顺序将整个数据分为一片片不连续增长(减少)的段,至少可以分多少段(题目一定要理解清楚,第一次看题我是真的不知道在干啥):递减就是a[i]>a[i+1],非递减就是a[i]<=a[i+1],递增就是a[i]<a[i+1],非递增就是a[i]>=a[i+1]。 这句话很重要,出题的作者可能想让大家这样想,(但是,非递减不就包括了递增吗,比如1 2 3 ,这不矛盾吗,小声哔哔,但题还是要做的。)
在这里插入图片描述

解决方案:

1.输入数据总长度和各个值
2.分为三种途径:
2.1. a[i+1]>a[i] ,则进入非递增序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位 置的判断
2.2. a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位 置的判断
2.3. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减 序列。
3.输出count即可。
虽然提交成功了,但是感觉好像哪里不对(上面矛盾的那里),也许我理解错了,哪位大佬有有更清晰的做法和思路(或者解释一下我上述的矛盾),欢迎探讨。

#include<iostream>
#include<vector>
using namespace std;
int NUINIU_sort()
{
	int i = 0;
	int count = 0;
	int n;
	vector<int> vres;
	cin >> n;
	vres.resize(n+1);
	for (int i = 0; i < n; i++)
	{
		cin >>vres[i] ;
	}
	while (i < n)
	{
		if (vres[i] < vres[i + 1])
		{
			while (i < n && vres[i] < vres[i + 1])
			{
				i++;
			}
			i++;
			count++;
		}
		else if(i < n && vres[i] == vres[i + 1])
		{
			i++;
		}

		else if (vres[i] > vres[i + 1])
		{
			while (i < n && vres[i] > vres[i + 1])
			{
				i++;
			}
			i++;
			count++;
		}
	}
	return count;
}

int main()
{
	cout << NUINIU_sort() << endl;
    system("pause");
    return 0;
}
发布了77 篇原创文章 · 获赞 16 · 访问量 6519

猜你喜欢

转载自blog.csdn.net/weixin_43886592/article/details/102989732