LeetCode 0034.在排序数组中查找元素的第一个和最后一个位置【Go】

简介: LeetCode 0034.在排序数组中查找元素的第一个和最后一个位置【Go】

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

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

题目描述

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

如果数组中不存在目标值 target,返回 [-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]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

思路

题目要求

  • 在升序数组中查找目标元素的索引区间
  • 若未找到目标元素,则返回[-1, -1]

在升序数组中查找目标元素,考虑使用二分查找法。但需要对二分法做出适当改变。

由于目标元素在数组中可能重复,所以使用二分法时需要在找到目标元素后,继续再向左和向右寻找左边界和右边界。

由于数组是升序的,所以重复元素在数组中也一定是连续的。

寻找左边界就是寻找第一个大于等于目标元素的元素的索引,寻找有边界就是寻找第一个大于目标元素的元素的索引。

注意

  • 寻找左边界:当找到目标元素后,判断当前元素nums[mid],若是mid=0nums[mid-1] < target,则无需继续向左寻找,左边界就是当前元素的索引mid。反之,执行right = mid - 1,继续左区间中寻找左边界。
  • 寻找右边界:当找到目标元素后,判断当前元素nums[mid],若是mid=len(nums)-1nums[mid+1] > target,则无需继续向左寻找,左边界就是当前元素的索引mid。反之,执行left = mid + 1,继续右区间中寻找右边界。

代码

Go

// 找左边界
func getLeftBorder(nums []int, target int) int {
  left, right := 0, len(nums)-1
  for left <= right {
    mid := left + (right-left)/2
    if nums[mid] < target {
      left = mid + 1
    } else if nums[mid] > target {
      right = mid - 1
    } else if nums[mid] == target && (mid == 0 || nums[mid-1] < target) {
      return mid
    } else {
      right = mid - 1
    }
  }
  return -1
}
//找右边界
func getRightBorder(nums []int, target int) int {
  left, right := 0, len(nums)-1
  for left <= right {
    mid := left + (right-left)/2
    if nums[mid] < target {
      left = mid + 1
    } else if nums[mid] > target {
      right = mid - 1
    } else if nums[mid] == target && (mid == len(nums)-1 || nums[mid+1] > target) {
      return mid
    } else {
      left = mid + 1
    }
  }
  return -1
}
func searchRange(nums []int, target int) []int {
  leftBorder := getLeftBorder(nums, target)
  rightBorder := getRightBorder(nums, target)
  return []int{leftBorder, rightBorder}
}

Link

GitHub

目录
相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
37 1
|
18天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
27 7
|
2月前
|
存储 前端开发 Go
Go语言中的数组
在 Go 语言中,数组是一种固定长度的、相同类型元素的序列。数组声明时长度已确定,不可改变,支持多种初始化方式,如使用 `var` 关键字、短变量声明、省略号 `...` 推断长度等。数组内存布局连续,可通过索引高效访问。遍历数组常用 `for` 循环和 `range` 关键字。
|
17天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
2月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
37 0
|
19天前
|
Go 索引
go语言修改元素
go语言修改元素
26 6
|
1月前
|
Java Go 数据处理
go语言使用切片而非数组
【10月更文挑战第18天】
16 1
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
24 0
Leetcode第三十三题(搜索旋转排序数组)
|
2月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
70 0
|
18天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。