来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给定一个按照升序排列的整数数组 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]
方法
func searchRange(_ nums: [Int], _ target: Int) -> [Int] {
var startIndex = 0
var endIndex = nums.count-1
while startIndex < endIndex {
let middleIndex = startIndex + (endIndex - startIndex)/2
if nums[middleIndex] == target {
return findNums(nums, middleIndex)
}else if nums[middleIndex] < target {
startIndex = middleIndex + 1
}else {
endIndex = middleIndex - 1
}
}
if startIndex == endIndex {
if nums[startIndex] == target {
return [startIndex,startIndex]
}
return [-1,-1]
}
return [-1,-1]
}
func findNums(_ nums: [Int], _ index: Int) -> [Int] {
var result = [index]
var leftIndex = index - 1
var rightIndex = index + 1
while leftIndex >= 0 || rightIndex < nums.count {
if leftIndex >= 0 {
if nums[leftIndex] == nums[index] {
result.insert(leftIndex, at: 0)
leftIndex -= 1
}else {
leftIndex = -1
}
}
if rightIndex < nums.count {
if nums[rightIndex] == nums[index] {
result.append(rightIndex)
rightIndex += 1
}else {
rightIndex = nums.count
}
}
}
if result.count == 1 {
result.append(result[0])
}
return [result.first!,result.last!]
}