求子序列的个数(C++、C语言)

题目描述
给定一串整数数列,求出所有的递增和递减子序列的数目。
具体如下图:

img

逐个元素遍历,根据递增递减关系,逐个判断

#include <stdio.h>
int main()
{
    int n,i,m,p,count=0,up=-1;
    scanf("%d",&n);
    scanf("%d",&p);
    for(i=1;i<n;i++)
    {
        scanf("%d",&m);
        if(m>p)
        {
            if(up != 1)
            {
                count++;
                up = 1;
            }
        }
        else
        {
            if(up != 0)
            {
                count++;
                up = 0;
            }
        }
        p = m;
    }
    printf("%d",count);
}

因为n>=2,所以先读取前两个数,根据两个数的大小得到当前子序列是升序还是降序,然后继续读取后面的数字,判断两个相邻数字的大小,根据当前升序或降序以及当前两个相邻数字的大小关系决定是否改变序列类型(升序变降序或者降序变升序,子序列数量+1)。
运行结果如下:

img

C语言代码:


#include <stdio.h>
int main()
{
    int n, i;
    int pre, cur; //前一个数、当前数字
    int flag; //升序或者降序标志,0表示升序,1表示降序
    int nmb = 0; //升序或降序子序列个数
    scanf("%d", &n); //读取数字的个数
    scanf("%d", &pre); //读取第一个数字
    scanf("%d", &cur); //读取第二个数字
    //判断当前序列类型:升序还是降序
    if (cur > pre)
        flag = 0; //升序
    else
        flag = 1; //降序

    nmb = 1; //子序列个数置1

    pre = cur;//当前数变为前一个数字,并开始读取后面的数字
    for (i = 2; i < n; i++) //从第三个数字开始读取
    {
        scanf("%d", &cur);
        if (flag == 0) //之前是升序
        {
            if (cur > pre) //仍然是升序
                pre = cur;
            else
            {
                nmb++; //子序列数+1
                pre = cur; 
                flag = 1; //变为降序
            }
        }
        else //之前是降序
        {
            if (cur < pre) //仍然是降序
                pre = cur;
            else
            {
                nmb++;
                pre = cur;
                flag = 0; //变为升序
            }
        }
        
    }
    printf("%d", nmb);
    return 0;
}

C++代码:

#include <iostream>
using namespace std;
int main()
{
    int n, i;
    int pre, cur; //前一个数、当前数字
    int flag; //升序或者降序标志,0表示升序,1表示降序
    int nmb = 0; //升序或降序子序列个数
    cin >> n; //读取数字的个数
    cin >> pre; //读取第一个数字
    cin >> cur; //读取第二个数字
    //判断当前序列类型:升序还是降序
    if (cur > pre)
        flag = 0; //升序
    else
        flag = 1; //降序

    nmb = 1; //子序列个数置1

    pre = cur; //当前数变为前一个数字,并开始读取后面的数字

    for (i = 2; i < n; i++) //从第三个数字开始读取
    {
        cin >> cur;
        if (flag == 0) //之前是升序
        {
            if (cur > pre) //仍然是升序
                pre = cur;
            else
            {
                nmb++; //子序列数+1
                pre = cur; 
                flag = 1; //变为降序
            }
        }
        else //之前是降序
        {
            if (cur < pre) //仍然是降序
                pre = cur;
            else
            {
                nmb++;
                pre = cur;
                flag = 0; //变为升序
            }
        }
        
    }
    cout << nmb;
    return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int a[101];
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    int up=0,down=0,walk=0;
    walk=a[1]-a[0];
    if (walk>0)
        up +=1;
    else down +=1;
    for (int i=2;i<n;i++)
    {
        if (walk*(a[i]-a[i-1])<0)
        {
            walk=a[i]-a[i-1];
            if (walk>0)
                up +=1;
            else down +=1;
        }
    }
    printf("%d",up+down);
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632