题解 | 在两个排序数组中找到第k小的数
package main
//采用力扣第四题寻找两个正序数组的中位数的思路
import (
"fmt"
"math"
)
func main() {
a := 0
b := 0
k := 0
fmt.Scan(&a)
fmt.Scan(&b)
fmt.Scan(&k)
nums1 := make([]int, a)
nums2 := make([]int, b)
for i := 0; i < a; i++ {
fmt.Scan(&nums1[i])
}
for j := 0; j < b; j++ {
fmt.Scan(&nums2[j])
}
result := Hepingk(nums1, nums2, k)
fmt.Println(result)
}
func Hepingk(nums1 []int, nums2 []int, k int) int {
if len(nums1) > len(nums2) {
nums1, nums2 = nums2, nums1
}
left := 0
right := min(k-1, len(nums1)-1) //当找第k个最小数的时候,他在数组上不会超过这个K的界限,如果没有这一行会超时
total := k
for left <= right {
i := left + (right-left)/2
j := total - i
if j > len(nums2)-1 {
left = i + 1
continue
}
if j < 0 {
left = i - 1
continue
}
if nums1[i] < nums2[j-1] {
left = i + 1
} else {
right = i - 1
}
}
i := left
j := total - i
var nums1LeftMax int
var nums2LeftMax int
if i == 0 {
nums1LeftMax = math.MinInt32
} else {
nums1LeftMax = nums1[i-1]
}
if j == 0 {
nums2LeftMax = math.MinInt32
} else {
nums2LeftMax = nums2[j-1]
}
return max(nums1LeftMax, nums2LeftMax)
}
func max(a int,b int) int{
if a>=b{
return a
}
return b
}
func min(a int,b int) int{
if a>=b{
return b
}
return a
}
