Chris0522 2022-01-21 00:08 采纳率: 0%
浏览 25

相信大家都会二分查找怎么用了,那么现在给你 N 个数的有序序列(下标从 0开始),再给你 M 次询问,对于每次询问给你一个 X,请你找出 X 在序列中最先出现的位置。如果 X 不在序列中请输出 −1。

第一行,空格隔开两个整数 NN 和 MM。

第二行输入 NN 个整数。

之后的 MM 行,每一行一个整数 XX,表示所需要找到的数。

输出格式
对于每次询问输出一个结果。

 样例 1
样例输入
Copy
5 3
1 2 3 3 5
1
3
6

样例输出
Copy
0
2
-1

用基础的C语言,但是一直不能输出-1


#include<stdio.h>

int main(void)
{
    int N,M,X[100],a[100],i,j,flag=1;
    int middle;
    scanf("%d%d",&N,&M);
    for(i=0;i<N;i++)
    {
        scanf("%d",&a[i]);
    }
    
    for(j=0;j<M;j++)
    {
        scanf("%d",&X[j]);
    }
    
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
            int left=0,right=N-1;
            middle=(left+right)/2;
            while(left<right)
            {
                if(a[middle]==X[j])
                {
                    printf("%d\n",middle);
                    break;
                }
                else if(a[middle]>X[j])
                {
                    right=middle-1;
                }
                else {
                    left=middle;
                }
                middle=(left+right)/2;    
                
            }
            
        }
                if(a[middle]!=X[j])
                {
                    flag=0;
                }    
            if(flag==0) printf("-1");
            
    }
    return 0;
}
  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2022-01-21 08:22
    关注

    最先出现的位置,却使用二分法,这有点教条了吧
    if(a[middle]==X[j])
    {
    printf("%d\n",middle);
    break;
    }
    这个判断也是不对啊,你这不是序列最先出现的位置,是二分法最先找到的位置,如果序列是1 3 3 3 5,你搜索3的话,你想得到的是2,还是1呢?

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 1月21日

悬赏问题

  • ¥15 工价表引用工艺路线,应如何制作py和xml文件
  • ¥15 根据历史数据,推荐问题类型
  • ¥15 需要仿真图,简单的二阶系统实例
  • ¥15 stm32光控照明仿真
  • ¥15 使用人工智能的方法生成满足一定统计参数要求的随机数序列
  • ¥15 SENT协议中相关问题咨询
  • ¥15 URL地址href跳转问题
  • ¥15 mysql数据库备份恢复
  • ¥15 mmdetection mask-rcnn
  • ¥25 matlab可以将微分方程的解显示为相图形式吗