老卫带你学---leetcode刷题(34. 在排序数组中查找元素的第一个和最后一个位置)

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

问题:

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

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

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 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]
提示:

0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109

解决:

二分查找

  • 寻找左边界
  • 寻找右边界

左边界需要同时满足: 1. 值等于target 2. 下标0,或者左边元素比他小
右边界需要同时满足: 1. 值等于target 2. 下标len-1,或者右边元素比他大

func searchRange(nums []int, target int) []int {
	left := searchLeft(nums, target)
	right := searchRight(nums, target)
	return []int{left,right}
}

func searchLeft(nums []int,target int) int{
	n := len(nums)
	l,r:=0,n-1
	for l<=r{
		mid := (r-l)/2+l
		if nums[mid]==target{
			if mid==0 || nums[mid-1]<target{
				return mid
			} else {
				r=mid-1
			}  
		}else if nums[mid]>target{
			r = mid-1
		} else {
			l=mid+1
		}
	}
	return -1
}


func searchRight(nums []int,target int) int{
	n := len(nums)
	l,r:=0,n-1
	for l<=r{
		mid := (r-l)/2+l
		if nums[mid]==target{
			if mid==n-1 || nums[mid+1]>target{
				return mid
			} else {
				l=mid+1
			} 	
		}else if nums[mid]>target{
			r = mid-1
		} else {
			l=mid+1
		}
	}
	return -1
}

你可能感兴趣的:(leetcode)