From 9abd1c8dd6e80340b84276d5156f1a8fa209a065 Mon Sep 17 00:00:00 2001 From: nite Date: Wed, 15 Jul 2026 20:46:11 +0800 Subject: [PATCH] u --- top-100-liked/63/leetcode_test.go | 38 ++++++++++++++++++++ top-100-liked/64/leetcode_test.go | 58 +++++++++++++++++++++++++++++++ top-100-liked/65/leetcode_test.go | 58 +++++++++++++++++++++++++++++++ top-100-liked/66/leetcode_test.go | 43 +++++++++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 top-100-liked/63/leetcode_test.go create mode 100644 top-100-liked/64/leetcode_test.go create mode 100644 top-100-liked/65/leetcode_test.go create mode 100644 top-100-liked/66/leetcode_test.go diff --git a/top-100-liked/63/leetcode_test.go b/top-100-liked/63/leetcode_test.go new file mode 100644 index 0000000..e9d7ad7 --- /dev/null +++ b/top-100-liked/63/leetcode_test.go @@ -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)) +} diff --git a/top-100-liked/64/leetcode_test.go b/top-100-liked/64/leetcode_test.go new file mode 100644 index 0000000..3e1a18c --- /dev/null +++ b/top-100-liked/64/leetcode_test.go @@ -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)) +} diff --git a/top-100-liked/65/leetcode_test.go b/top-100-liked/65/leetcode_test.go new file mode 100644 index 0000000..4acd508 --- /dev/null +++ b/top-100-liked/65/leetcode_test.go @@ -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)) +} diff --git a/top-100-liked/66/leetcode_test.go b/top-100-liked/66/leetcode_test.go new file mode 100644 index 0000000..23c6109 --- /dev/null +++ b/top-100-liked/66/leetcode_test.go @@ -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})) +}