u
This commit is contained in:
@@ -0,0 +1,38 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/search-insert-position/description/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
|
||||||
|
func searchInsert(nums []int, target int) int {
|
||||||
|
start, end := 0, len(nums)-1
|
||||||
|
for start < end {
|
||||||
|
mid := start + (end-start)/2
|
||||||
|
if nums[mid] == target {
|
||||||
|
return mid
|
||||||
|
} else if nums[mid] > target {
|
||||||
|
end = mid - 1
|
||||||
|
} else {
|
||||||
|
start = mid + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if nums[end] < target {
|
||||||
|
return end + 1
|
||||||
|
}
|
||||||
|
return end
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test(t *testing.T) {
|
||||||
|
fmt.Printf("%+v\n", searchInsert([]int{1, 3, 5, 6}, 5))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test2(t *testing.T) {
|
||||||
|
fmt.Printf("%+v\n", searchInsert([]int{1, 3, 5, 6}, 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test3(t *testing.T) {
|
||||||
|
fmt.Printf("%+v\n", searchInsert([]int{1, 3, 5, 6}, 7))
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/search-a-2d-matrix/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
|
||||||
|
// 难在边界条件
|
||||||
|
func searchMatrix(matrix [][]int, target int) bool {
|
||||||
|
// 第一列竖着找
|
||||||
|
m := len(matrix)
|
||||||
|
n := len(matrix[0])
|
||||||
|
for i := range m {
|
||||||
|
cur := matrix[i][0]
|
||||||
|
switch {
|
||||||
|
case cur == target:
|
||||||
|
return true
|
||||||
|
case cur > target:
|
||||||
|
// target 可能在 i-1 行
|
||||||
|
if i-1 >= 0 {
|
||||||
|
for j := range n - 1 {
|
||||||
|
if matrix[i-1][j+1] < target {
|
||||||
|
continue
|
||||||
|
} else if matrix[i-1][j+1] == target {
|
||||||
|
return true
|
||||||
|
} else if matrix[i-1][j+1] > target {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case cur < target:
|
||||||
|
// 如果 i == m-1 (最后一行)
|
||||||
|
if i == m-1 {
|
||||||
|
for j := range n - 1 {
|
||||||
|
if matrix[i][j+1] < target {
|
||||||
|
continue
|
||||||
|
} else if matrix[i][j+1] == target {
|
||||||
|
return true
|
||||||
|
} else if matrix[i][j+1] > target {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test(t *testing.T) {
|
||||||
|
matrix := [][]int{{1, 3, 5, 7}, {10, 11, 16, 20}, {23, 30, 34, 60}}
|
||||||
|
target := 3
|
||||||
|
fmt.Println(searchMatrix(matrix, target))
|
||||||
|
target = 13
|
||||||
|
fmt.Println(searchMatrix(matrix, target))
|
||||||
|
}
|
||||||
@@ -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))
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package top100liked
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
|
||||||
|
func findMin(nums []int) int {
|
||||||
|
if len(nums) == 1 {
|
||||||
|
return nums[0]
|
||||||
|
}
|
||||||
|
if nums[0] < nums[len(nums)-1] {
|
||||||
|
return nums[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
start := 0
|
||||||
|
end := len(nums) - 1
|
||||||
|
for start <= end {
|
||||||
|
mid := start + (end-start)/2
|
||||||
|
if mid >= 1 && nums[mid-1] > nums[mid] && mid < len(nums)-1 && nums[mid] < nums[mid+1] {
|
||||||
|
return nums[mid]
|
||||||
|
}
|
||||||
|
if nums[mid] > nums[end] {
|
||||||
|
// 最小值在右侧
|
||||||
|
start = mid + 1
|
||||||
|
} else {
|
||||||
|
// 最小值在左侧
|
||||||
|
end = mid - 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if nums[start] > nums[end] {
|
||||||
|
return nums[end]
|
||||||
|
}
|
||||||
|
return nums[start]
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test(t *testing.T) {
|
||||||
|
// fmt.Println(findMin([]int{3, 4, 5, 1, 2}))
|
||||||
|
// fmt.Println(findMin([]int{3, 1, 2}))
|
||||||
|
fmt.Println(findMin([]int{2, 1}))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user