u
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package top100liked
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/?envType=study-plan-v2&envId=top-100-liked
|
||||
|
||||
func binarySearch(nums []int, target int) int {
|
||||
start := 0
|
||||
end := len(nums) - 1
|
||||
for start <= end {
|
||||
midIdx := start + (end-start)/2
|
||||
mid := nums[midIdx]
|
||||
if mid == target {
|
||||
return midIdx
|
||||
} else if mid > target {
|
||||
end = midIdx - 1
|
||||
} else if mid < target {
|
||||
start = midIdx + 1
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func searchRange(nums []int, target int) []int {
|
||||
res := binarySearch(nums, target)
|
||||
if res == -1 {
|
||||
return []int{-1, -1}
|
||||
}
|
||||
|
||||
l, r := res-1, res+1
|
||||
for l >= 0 {
|
||||
_l := binarySearch(nums[:l+1], target)
|
||||
if _l == -1 {
|
||||
break
|
||||
} else {
|
||||
l = _l - 1
|
||||
}
|
||||
}
|
||||
for r < len(nums) {
|
||||
_r := binarySearch(nums[r:], target)
|
||||
if _r == -1 {
|
||||
break
|
||||
} else {
|
||||
r = r + _r + 1
|
||||
}
|
||||
}
|
||||
return []int{l + 1, r - 1}
|
||||
}
|
||||
|
||||
func Test(t *testing.T) {
|
||||
nums := []int{5, 7, 7, 8, 8, 10}
|
||||
fmt.Printf("%+v\n", searchRange(nums, 8))
|
||||
fmt.Printf("%+v\n", searchRange(nums, 6))
|
||||
fmt.Printf("%+v\n", searchRange([]int{}, 0))
|
||||
}
|
||||
Reference in New Issue
Block a user