你有进一步深入理解二分查找吗?



int?binarySearch(int?target)
{
????int?ret=-1;
????int?len=arr.size();
????int?left=0;
????int?right=len-1;
????while(left< =right)
????{
????????int?mid=(left+right)/2;
????????if(target==arr[mid])
????????{
????????????ret=mid;
????????????break;
????????}
????????else?if(targetmid])
????????{
????????????right=mid-1;
????????}
????????else
????????{
????????????left=mid+1;
????????}
????}
????return?ret;
}
看一个最简单的二分查找的例子:











还可以针对什么进行二分查找呢?






int?findSummit(vector< int>?arr)
{
???int?len=arr.size();
???int?left=0;
???int?right=len-1;
???while(left< =right)
???{
???????int?mid=(left+right)/2;
???????int?pre=arr[mid-1];
???????int?now=arr[mid];
???????int?aft=arr[mid+1];
???????if(preaft)
???????{
???????????return?mid;
???????}
???????else?if(pre ???????{
???????????//峰值在右边
???????????left=mid+1;
???????}
???????else
???????{
???????????//峰值在左边
???????????right=mid;
???????}
???}
???return?-1;
}
这里与简单二分查找略有不同的是峰值如果在左边right置为mid而不是mid-1,这是为了防止数组越界,大家可以思考一下为什么,本文主要介绍二分思想就不再过多介绍了。
/**
*?//?This?is?the?MountainArray's?API?interface.
*?//?You?should?not?implement?it,?or?speculate?about?its?implementation
*?class?MountainArray?{
*???public:
*?????int?get(int?index);
*?????int?length();
*?};
*/
class?Solution?{
public:
???int?findInMountainArray(int?target,?MountainArray?&mountainArr)?{
???????int?len=mountainArr.length();
???????int?left=0;
???????int?right=len-1;
???????int?summit=-1;
???????int?mid=-1;
???????while(left< =right)
???????{
???????????mid=(left+right)>>1;
???????????int?pre=mountainArr.get(mid-1);
???????????int?now=mountainArr.get(mid);
???????????int?aft=mountainArr.get(mid+1);
???????????if(preaft)
???????????{
???????????????summit=mid;
???????????????break;
???????????}
???????????else?if(pre ???????????{
???????????????left=mid+1;
???????????}
???????????else
???????????{
???????????????right=mid;
???????????}
???????}
???????left=0;
???????right=summit;
???????while(left< =right)
???????{
???????????mid=(left+right)>>1;
???????????int?now=mountainArr.get(mid);
???????????if(target==now)
???????????{
???????????????return?mid;
???????????}
???????????else?if(target ???????????{
???????????????right=mid-1;
???????????}
???????????else
???????????{
???????????????left=mid+1;
???????????}
???????}
???????left=summit;
???????right=len-1;
???????while(left< =right)
???????{
???????????mid=(left+right)>>1;
???????????int?now=mountainArr.get(mid);
???????????if(target==now)
???????????{
???????????????return?mid;
???????????}
???????????else?if(target>now)
???????????{
???????????????right=mid-1;
???????????}
???????????else
???????????{
???????????????left=mid+1;
???????????}
???????}
???????return?-1;
???}
};




class?Solution?{
public:
???vector< int>?nums;
???int?len;
???int?rvalue;
???int?left,right;
???int?findSummit()
???{
???????while(left< =right)
???????{
???????????int?mid=(left+right)>>1;
???????????if((mid==0&&mid+1nums[mid+1])||(mid-1>=0&&mid+1 nums[mid-1]&&nums[mid]>nums[mid+1]))
???????????{
???????????????return?mid;
???????????}
???????????else?if(nums[mid] ???????????{
???????????????right=mid-1;
???????????}
???????????else
???????????{
???????????????left=mid+1;
???????????}
???????}
???????return?-1;
???}
???int?search(vector< int>&?nums,?int?target)?{
???????this->nums=nums;
???????len=nums.size();
???????if(len==0)
???????{
???????????return?-1;
???????}
???????//右半部分最大值
???????rvalue=nums[len-1];
???????left=0;
???????right=len-1;
???????int?summit=findSummit();
???????if(target>rvalue)
???????{
???????????//在左半部分
???????????left=0;
???????????right=summit;
???????}
???????else
???????{
???????????//在右半部分
???????????left=summit+1;
???????????right=len-1;
???????}
???????while(left< =right)
???????{
???????????int?mid=(left+right)>>1;
???????????if(target==nums[mid])
???????????{
???????????????return?mid;
???????????}
???????????else?if(target ???????????{
???????????????right=mid-1;
???????????}
???????????else
???????????{
???????????????left=mid+1;
???????????}
???????}
???????return?-1;
???}
};




热 文?推 荐?
?天猫回应“双11数据造假”:已启动司法流程;小米折叠手机专利曝光;ASP.NET感染勒索软件|极客头条
?重大利好!人民日报海外版整版报道:区块链“链”向未来,既要积极又要稳妥
点击阅读原文参与开发者大调查,好礼送不停!

关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 中国经济向世界提供“机遇清单” 7904362
- 2 朱元璋换帅照后明孝陵火了 7809495
- 3 水银体温计将禁产 有网友囤货100支 7712162
- 4 2025这些“经济”持续成长壮大 7618465
- 5 近8000吨车厘子来了 7524001
- 6 老人接孙女从认不出到相拥大哭 7424943
- 7 冯提莫自曝癌症复发并转移 7330361
- 8 唐湘龙:两岸统一日本就完了 7236357
- 9 西班牙女员工连续提前到岗被开除 7139206
- 10 寒潮来袭!多地气温将创下半年来新低 7042161







CSDN
