二分查找 数组 相关题目推荐

目录

  • 一、二分查找 续集
    • 34. 在排序数组中查找元素的第一个和最后一个位置
    • 69.x 的平方根

一、二分查找 续集

34. 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

python 写法:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        # 寻找右边界
        def rightBorad(nums: List[int], target: int) ->int:
            left ,right =0,len(nums)-1
            rightBorad =-2
            while left<=right:
                mid = left +(right-left)//2
                if nums[mid]>target:
                    right=mid-1
                else:
                    left =mid+1
                    rightBorad=left       
            return rightBorad
       # 寻找左边界
        def leftBorad(nums: List[int], target: int) ->int:
            left,right =0,len(nums)-1
            leftBorad =-2
            while left<=right:
                mid = left +(right-left)//2
                if nums[mid]<target:
                    left=mid+1
                else:
                    right =mid-1
                    leftBorad=right
            return leftBorad
        # 调用左右边界函数 得到 左右边界值
        leftborad = leftBorad(nums,target)
        rightborad =rightBorad(nums,target)
        if leftborad==-2 or  rightborad==-2: 
            return [-1,-1]
        if rightborad-leftborad>1:
            # 在界限内 返回  [leftborad+1,rightborad-1],边界线上不包含故 左右都向内+1 -1
            return [leftborad+1,rightborad-1]
        return [-1,-1]

GO 的写法:

func searchRange(nums []int, target int) []int {
    
    leftBorder :=leftbraod(nums,target)
    rightBorder :=rightbraod(nums,target)
    //情况1:target 在数组范围的右边或者左边
    if leftBorder == -2 || rightBorder == -2 {
       return  []int{-1, -1}
        }
        // 情况三:target 在数组范围中,且数组中存在target
      if rightBorder - leftBorder > 1 {
          return  []int{leftBorder + 1, rightBorder - 1}
        } 
        // 情况二:target 在数组范围中,且数组中不存在target
      return []int{-1, -1}
}


//寻找右边界
func rightbraod(nums []int, target int) int{
    left:=0
    right :=len(nums)-1
    rightbraod :=-2  //定义一个没有赋值的右边界,不包括target在内 
    for left<=right {
        mid :=left+(right-left)/2
        if nums[mid]>target{
              right=mid-1
        }else if nums[mid]<=target{
            left =mid+1   //当nums[mid]< = target 时 都需要更新left,得到右边界
            rightbraod=left   //找到右边界
        }
    }
    //当 left>right
    return rightbraod
}

//寻找左边界
func leftbraod(nums []int, target int) int{
    left:=0
    right :=len(nums)-1
    leftbraod := -2
    for left<=right {
        mid :=left+(right-left)/2
        if nums[mid]<target{
             left=mid+1
        }else if nums[mid]>=target{
            right =mid-1 //当nums[mid]> = target 时 都需要更新right,得到左边界
            leftbraod=right   //找左边界
        }
    }
    return leftbraod
}

69.x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

GO 的写法:

func mySqrt(x int) int {
    left:=0
    right:=x
    ans:=-1
    for left<=right {
        mid :=(left+right)/2
        if mid*mid <= x{
            ans=mid
            left=mid+1
        }else if mid*mid > x{
            right=mid-1
        }
    }
    return ans

}

你可能感兴趣的:(算法,数据结构,leetcode)