牛客算法-拆分序列
題目描述:
牛牛定義排序子序列爲個數組中一 段連續的子序列,並且這段子序列是非遞增或者非遞減排序的。牛牛有個長度爲n的整數數組A,他現在有 個任務是把數組A分爲若干段排序子序列,牛牛想知道他最少可以把這個數組分爲幾段排序子序列,如樣例所示,牛牛可以把數組A劃分爲[1,2,3]和[2,2, 1兩個排序子序列,至少需要劃
分爲2個排序子序列,所以輸出2
輸入描述:
輸入的第一行爲一個正整數:(1≤n≤10^5)
第二行包括n個整數a_i(1≤a_i≤10個9),表示數組A的每個數字
輸出描述:
輸出一個整數表示牛牛可以將A最少劃分爲多少段排序子序列
思路:使用一個標誌位來依據數組的遞增或遞減來判斷數組是否連續,不連續則可以拆分一次
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int number=0,flag=0,subnumber=1;
cin>>number;
if(number==0){
printf("%d",0);exit(0);
}
int arr[number];
for(int index=0;index<number;index++){
cin>>arr[index];
}
for(int index=1;index<number;index++){
//當前值與前一個值相同時,flag不發生變化
if(arr[index-1]==arr[index]){
continue;
}
if(arr[index-1]<arr[index]){
if(flag==0){ //當數組爲遞增時flag設置爲1
flag=1;
}
if(flag==-1){ //當數組遞增且flag爲-1時表示此時數組由遞減轉爲遞增
flag=0;
subnumber++;
}
}else if(arr[index-1]>arr[index]){
if(flag==0){ //當數組爲遞減時flag設置爲-1
flag=-1;
}
if(flag==1){ //當數組遞減且flag爲1時表示此時數組由遞增轉爲遞減
flag=0;
subnumber++;
}
}
}
printf("%d",subnumber);
}