二分

二分法:

1.原理:

在升序数组 nums 中寻找目标值nums[i],对于特定下标 i,比较nums[i] 和target 的大小:

  如果 nums[i] = target ,则下标 i 即为要寻找的下标;

如果  nums[i] > target,则 target 只可能在下标 i 的左侧;

如果  nums[i] < target,则 target只可能在下标 i 的右侧。

基于上述事实,可以在有序数组中使用二分查找寻找目标值。

二分查找的做法是,定义查找的范围[left,right],初始查找范围是整个数组。每次取查找范围的中点mid,比较 nums[mid] 和 target 的大小,如果相等则 mid 即为要寻找的下标,如果不相等则根据 nums[mid] 和target 的大小关系将查找范围缩小一半。

  由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是 O(logn),其中 n是数组的长度。

      一般获取数组中点的方法为:

intmid=left+(right-left)/2;

这样做的好处是可以防止数据过大,超过int的界限。

2.代码实现:

      intleft=0;

intright=nums.length-1;

intmid=left+(right-left)/2;

while(left<=right){

if(nums[mid]==target){

returnmid;

}

if(nums[mid]>target){

right=mid-1;

intmid=left+(right-left)/2;

              //目标值小于nums[mid],变化右边界值,缩小范围

}

if(nums[mid]<target){

left=mid+1;

intmid=left+(right-left)/2;

                  //目标值小于nums[mid],变化左边界值,缩小范围

}

}

return-1;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容