前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2021-08-13:给定一个每一行有序、每一列也有序,整体可

2021-08-13:给定一个每一行有序、每一列也有序,整体可

原创
作者头像
福大大架构师每日一题
修改于 2021-08-16 02:22:08
修改于 2021-08-16 02:22:08
3450
举报

2021-08-13:给定一个每一行有序、每一列也有序,整体可能无序的二维数组 ,在给定一个正数k,返回二维数组中,最小的第k个数。

福大大 答案2021-08-13:

二分法。

代码用golang编写。代码如下:

代码语言:txt
AI代码解释
复制
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
    }
}

执行结果如下:

图片
图片

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文