链接:https://www.nowcoder.com/questionTerminal/2d3f6ddd82da445d804c95db22dcc471 来源:牛客网
题目描述
牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为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的每个数字。
输出描述: 输出一个整数表示牛牛可以将A最少划分为多少段排序子序列
示例1 输入 6 1 2 3 2 2 1 输出 2
题目分析
暴力解法,不要把自己绕晕,一个一个遍历,当递增递减序列停止的时候count++。 注意为了避免a[i+1]的越界,我们在数组后加一个零,因为由题干可知,所有的数据都比0大且0在第n个位置,所以不会对结果有影响。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> a;
a.resize(n+1);
for(auto& e:a)
{
cin>>e;
}
a[n]=0;
int count=0;
int i=0;
while(i<n)
{
if(a[i]<a[i+1])
{
while(a[i]<a[i+1]&&i<n)
{
i++;
}
count++;
i++;
}
if(a[i]==a[i+1])
{
i++;
}
if(a[i]>a[i+1])
{
while(a[i]>a[i+1]&&i<n)
{
i++;
}
count++;
i++;
}
}
cout<<count;
}
个人总结
从这道题可以抽象出来一个模型:在一个数组中截取一段连续的性质相同的序列,可以采用whie--if--while模型。
while(A)
{
if(B)
{
while(A&&B)
{
++i;
}
}
if(C)
{
while(A&&C)
{
++i;
}
}
//.......
}
该模型的意思是,找到同时满足A和B的序列,其中A为i前进条件,B为元素所满足的条件。当序列中下一个元素不满足B的时候,同时退出while与if语句。方便查找满足另一个条件C的序列。