题解 | #二分查找-II#

二分查找-II

http://www.nowcoder.com/practice/4f470d1d3b734f8aaf2afb014185b395

算法思想:设置 low 和 high 两个指针,mid每次指向区间中间的元素,即 mid = low+(low+high)/2 ( 这里采用此形式而不是使用 mid=(low+high)/2 ,是为了防止 int 型数据的溢出),如果 mid 所指的值大于 target,则在左半区间[low,mid-1]查找;如果 mid 所指的值小于 target,则在右半区间查找[mid+1,high]。与无重复有序数组二分查找要求所不同的是,找到 target 还要保证是第一个target,一个思路是找到 target后继续向前搜索,前一个值如果依然和 target 值相等,继续向前搜索,直到不相等为止。

C语言实现:

int search(int* nums, int numsLen, int target ) {
	int low=0,high=numsLen-1;
	int mid;
	while(low<=high){
		mid=low+(high-low)/2;
		if(nums[mid]==target) {//找到后继续向前检查是否为第一个目标值 
			int test=mid-1;//向前探测指针 
			while(test>=0&&nums[test]==target) test--;//和 target 值相等,继续向前搜索
			mid=test+1;//定位到第一个target
			return mid;//返回target在数组中的下标
		}
		else if(nums[mid]<target) low=mid+1;//右半区间查找
		else  high=mid-1;	//左半区间查找
	}
	return -1;
}
全部评论

相关推荐

02-12 17:30
已编辑
字节跳动_实习生(实习员工)
要怎么办呢牛:我觉得大厂日常实习最大的意义就是给自己背书,一个好公司的实习就像一个好学历似的,能够给自己增加一个标签,让别人觉得你可以。(至于真正实习干了啥,这个感觉并不太重要)。当然一家之言,仅供参考。另外,楼主已经很强了,实习毕业双双拿下,已经领先好多好多人了,羡慕啊
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务