问题标题: 酷町堂:2773

0
0
已解决
孙坚恒
孙坚恒
资深守护
资深守护

#include<iostream>
using namespace std;
int main()
int findFirst(int a[],int n,int k)
{
    int l=1,r=n;
    while(l<r)
    {
        int mid=(l+r+1)/2;
        /*
            a/b
            (a+b)/b
        */
        if(k<=a[mid])r=mid-1;
        else l=mid;
    }
    if(a[1]==k)return 1;
    if(r<n && a[r+1]==k)return r+1;
    return -1;
}

 

 

 

哪错了????????


1
已采纳
栾峻岩
栾峻岩
初级天翼
初级天翼

这道题是六个二分模板中的第三个,就是输出元素最后一次出现位置。

如果没有学到,建议先打牢基础再去理解这道题!

如果学过了,那么错误有:

1、 输出m行,每行为查询数字的位置(位置从1开始算)。

但你的程序没有进行多次操作(可能有,因为你main主程序的内容我看不到)。

 

2、

your code_1:
int mid=(l+r+1)/2;

二分的mid值是l和r的平均数(二分二分,取掉一半)。
所以应该是:
mid=(l+r)/2;

 

3、

your code_2:
if(k<=a[mid])r=mid-1;
else l=mid;

解释:

 

4、

your_code 3:
r=n;

l最多会到达r的值,如果我们要查询数组中最后一个元素,那么l就会等于r,l的前一个可能就是一个不符合要求的答案,所以:

r初始值为n+1!

如果a数组中第l-1个元素不是要查询的元素(l是正确答案+1),则找不到,输出-1,否则输出l-1。

祝你AC!

0
孙坚恒
孙坚恒
资深守护
资深守护

请发全部代码谢谢了!!!

0
周建勋
周建勋
中级光能
中级光能

建议先打好基础,而且不能要整段代码哦,只能问核心,思想哦!!!

望采纳,谢谢!!!

0
我要回答