C++ 工程师养成 每日一题third (子数列排序)

题目:

定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

 

 

 解题思路:

解答这道题最重要的是思路清晰,只要了解了步骤就会很好解决。排序子序列为非递增或者非递减,很多同学在这个非递增、非递减问题上很纠结,注意:非递减就是a[i]<=a[i+1],递减就是a[i]>a[i+1],非递增就是a[i]>=a[i+1],递增就是a[i]<a[i+1].

1. 依次比较整个数组
2. a[i+1]>a[i] ,则进入非递增序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位
置的判断
3. a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位
置的判断
4. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减
序列。

解答:

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int i=0,n, sum=0;
    vector<int> a;
    cin >> n;
    a.resize(n+1);
    for (int m = 0; m < n; ++m){
        cin >> a[m];
    }
    while (i < n){
        if (a[i + 1]>a[i]){
            while (i<n&&a[i + 1]>a[i]){
                i++;
            }
            sum++;
            i++;
        }
        else if (a[i + 1] < a[i]){
            while (i<n&&a[i + 1]<a[i]){
                i++;
            }
            sum++;
            i++;
        }
        else{
            i++;
        }
    }
    cout << sum;
      return 0;
}

 

猜你喜欢

转载自www.cnblogs.com/Kaniso-Vok/p/11832386.html