题解 | 在两个排序数组中找到第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
}


全部评论

相关推荐

rbjjj:太杂了吧,同学,项目似乎都没深度,都是api调度耶,分层架构思想没有体现出来了,前端没有前端优化前端工程化体现,后端微服务以及分层架构没体现以及数据安全也没体现,核心再改改,注重于计算机网络,工程化,底层原理吧
点赞 评论 收藏
分享
孙艹肘:校招不给三方直接让实习我都去了,,主打一个在学校呆着也是闲着,不如出来实习一下
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务