2021-08-13:给定一个每一行有序、每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数。
2021-08-13:给定一个每一行有序、每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数。
福大大 答案2021-08-13:
二分法。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
)
func main() {
matrix := [][]int{{1, 2, 3}, {2, 3, 4}, {3, 4, 5}}
ret := kthSmallest2(matrix, 8)
fmt.Println(ret)
}
// 二分的方法
func kthSmallest2(matrix [][]int, k int) int {
N := len(matrix)
M := len(matrix[0])
left := matrix[0][0]
right := matrix[N-1][M-1]
ans := 0
for left <= right {
mid := left + ((right - left) >> 1)
// <=mid 有几个 <= mid 在矩阵中真实出现的数,谁最接近mid
info := noMoreNum(matrix, mid)
if info.num < k {
left = mid + 1
} else {
ans = info.near
right = mid - 1
}
}
return ans
}
type Info struct {
near int
num int
}
func NewInfo(n1 int, n2 int) *Info {
ans := &Info{}
ans.near = n1
ans.num = n2
return ans
}
func noMoreNum(matrix [][]int, value int) *Info {
near := math.MinInt64
num := 0
N := len(matrix)
M := len(matrix[0])
row := 0
col := M - 1
for row < N && col >= 0 {
if matrix[row][col] <= value {
near = getMax(near, matrix[row][col])
num += col + 1
row++
} else {
col--
}
}
return NewInfo(near, num)
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:
公众号:福大大架构师每日一题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
2020-08-13 2020-08-13:Hadoop生态圈的了解?