《算法笔记》4.5小节——算法初步->二分 问题 B: 打印极值点下标

问题 B: 打印极值点下标

题目描述
在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。
输入
每个案例的输入如下:
有2×n+1行输入:第一行是要处理的数组的个数n;
对其余2×n行,第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。
输出
每个案例输出不多于n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔,如果没有极值点则不输出任何东西。
样例输入 Copy
2
4
1 2 1 3
5
3 4 5 6 7
样例输出 Copy
0 1 2 3
0 4

思路分析:把输入的数组分为三个部分。head,middle,tail。第一个数只要于第二个数不相等,则其为极值;中间的元素可以用题目中极值的定义条件进行判断;最后一个元素只要不等于倒数第二个元素,则其为极值。
代码时间:

#include <iostream>
#include <cstdio>
using namespace std;
int s[100],s1[100];//s用来存放输入的数组元素,s1用来存放极值的下标
int main()
{
    int n,m,k=0;
    while(scanf("%d",&n)!=EOF)//组数
    {
        //存放数组元素
        while(n--)
        {
            scanf("%d",&m);//一个数组的元素个数
            s[100]=0,s1[0]= {0},k=0;
            for(int i=0; i<m; i++)
            {
                scanf("%d",&s[i]);
            }
            if(s[0]!=s[1])//head
            {
                s1[0]=0;
                k++;
            }
            for(int i=1; i<m-1; i++)//middle
            {
                if((s[i]>s[i-1]&&s[i]>s[i+1])||(s[i]<s[i-1]&&s[i]<s[i+1]))
                {
                    s1[k]=i;
                    k++;
                }
            }
            if(s[m-1]!=s[m-2])//tail
            {
                s1[k]=m-1;
                k++;
            }
            if(k>0)//如果数组s1不为空,输出
            {
                for(int i=0; i<k-1; i++)
                {
                    printf("%d ",s1[i]);
                }
                printf("%d\n",s1[k-1]);//最后一个无空格,直接换行
            }

        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值