牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n; //总共有多少个数
cin >> n;
vector<int> a_n(100000, 0); //创建一个数组,数组长度为最大值
int i = 0;
while (i < n)
{
cin >> a_n[i]; //将数保存到数组中
i++;
}
int cut = 0, j = 0; //定义cut来计数
/*
思路: 当一个新序列进来时
首先判断它是递减数列,还是递增数列或者连等数列,
当它是连等数列的时候,直接进行下一个循环
当它是递减数列或者递增数列的时候,判断他是否是连续的,
如果是连续的就继续向后判断,直到跳出;
这时的跳出,代表这个序列已经划分出来,要重新进行下一个序列的判断
*/
while (j < n)
{
if (a_n[j] < a_n[j + 1]) { //如果为递增数列
while (j < n && a_n[j] <= a_n[j + 1]) //判断是否为连续递增
{
j++; //如果是连续的就继续向后判断, 直到跳出
}
cut++; //当不在是递增的时候cut+1;并跳出递增判断
j++;
}
else if (a_n[j] == a_n[j + 1]){ //判断是否为相等的
j++;
}
else{ //如果是递减数列
while (j < n && a_n[j] >= a_n[j + 1]) //判断是否为连续递减
{
j++; //如果是连续的就继续向后判断,直到跳出
}
cut++; //跳出时cut + 1
j++;
}
}
cout << cut << endl;
return 0;
}