zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    假设的立场
    Win32资源的使用
    printf()可变域宽输出
    C语言qsort()函数
    OSG-VS2013-X64编译
    Windows下64位SQLite3.10动态库编译
    linux常用命令-个人收藏
    MongoDB3.0安装
    nginx+fastcgi+spawn-fcgi
    linux中codeblocks程序编译运行后不出现控制台窗口
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/11832386.html
Copyright © 2011-2022 走看看