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
}
}
执行结果如下:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有