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