前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二分查找实现

二分查找实现

作者头像
_春华秋实
修改2023-08-27 10:51:14
5850
修改2023-08-27 10:51:14
举报
文章被收录于专栏:_春华秋实_春华秋实

Golang 代码实现

代码语言:javascript
复制
 1 func search( nums []int ,  target int ) int {
 2     high := len(nums) - 1
 3     var low, middle, middleValue int
 4     for low <= high { //退出条件是小于等于
 5         middle = low + (high - low) / 2 //防止出现越界
 6         middleValue = nums[middle]
 7         if middleValue == target {
 8             return middle
 9         } else if middleValue > target {
10             high = middle - 1
11         } else {
12             low = middle + 1
13         }
14     }
15     return -1
16 }

实现二分查找的注意事项

  1. 退出条件是 low <= high
  2. middle 取值防止出现越界
  3. high 和 low 要进行 +- 1 的操作

题目:在排序数组中查找元素的第一个和最后一个位置

代码语言:javascript
复制
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。

示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

这是属于查找类型的题目,因为数组是一个升序排列的整数叔组所以很容易想到使用二分查找这种思想来实现 O(log n) 级别的效率获取答案结果。代码如下

PHP 代码实现

代码语言:php
复制
 1 class Solution {
 2 
 3     /**
 4      * @param Integer[] $nums
 5      * @param Integer $target
 6      * @return Integer[]
 7      */
 8     function searchRange($nums, $target) {
 9         $len = count($nums);
10         $r = $len;
11         $l = 0;
12         $middle = 0;
13         $found = false;
14         while ($l <= $r && !$found) {
15             $middle = ceil($l+($r-$l)/2); //向上取整,PHP 不是整除时会发生类型转换
16             switch (true) {
17                 case $nums[$middle] > $target:
18                     $r = $middle - 1; break;
19                 case $nums[$middle] < $target:
20                     $l = $middle + 1; break;
21                 default : $found = true; break;
22             }
23         }
24         if ($nums[$middle] !== $target) {
25             return [-1, -1];
26         } else {
27             for ($l=$middle; $l>0&&$nums[$l-1]==$target;){
28                 $l--;
29             }
30             for ($r=$middle; $r<$len-1&&$nums[$r+1]==$target;){
31                 $r++;
32             }
33             return [$l, $r];
34         }
35     }
36 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Golang 代码实现
  • 实现二分查找的注意事项
  • 解题思路
    • PHP 代码实现
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档