当前位置: 首页 > wzjs >正文

网站建设咨询电话免费推广软件哪个好

网站建设咨询电话,免费推广软件哪个好,做网站怎么在图片上加文字,合肥专业手机网站哪家好题目 给定一个n行n列的矩阵,这个矩阵的每一行是递增有序的,求这个矩阵中第k小的元素。 解答 优解 基于二分查找和按行统计小于等于目标值的元素个数。算法的时间复杂度为,其中D是矩阵中元素值域的范围(即最大值与最小值的差&a…

题目

给定一个n行n列的矩阵,这个矩阵的每一行是递增有序的,求这个矩阵中第k小的元素。

解答

优解

基于二分查找和按行统计小于等于目标值的元素个数。算法的时间复杂度为O(nlognlogD),其中D是矩阵中元素值域的范围(即最大值与最小值的差),空间复杂度为O(1)(不包括输入矩阵)。

算法描述
  1. 确定值域范围

    • 计算矩阵中的最小值 min_val:取所有行首元素(即每行的第一个元素)的最小值,即 min_val = min(matrix[i][0] for i in range(n))

    • 计算矩阵中的最大值 max_val:取所有行尾元素(即每行的最后一个元素)的最大值,即 max_val = max(matrix[i][n-1] for i in range(n))

    • 初始化二分查找的左边界 left = min_val,右边界 right = max_val

  2. 二分查找第 k 小元素

    • 当 left < right 时,执行循环:

      • 计算中间值 mid = (left + right) // 2(整数除法)。

      • 统计矩阵中小于等于 mid 的元素个数 count

        • 对于每一行 i(因为行是递增有序),使用二分查找找到该行中最后一个小于等于 mid 的元素的列索引 j(即最大的 j 满足 matrix[i][j] <= mid)。则该行中小于等于 mid 的元素个数为 j+1(列索引从 0 开始)。

        • 对所有行的结果求和,得到 count

      • 如果 count >= k,则第 k 小元素小于等于 mid,设置 right = mid

      • 否则,第 k 小元素大于 mid,设置 left = mid + 1

    • 循环结束后,left 即为第 k 小元素的值。

算法正确性
  • 该算法通过二分查找值域,逐步缩小第 k 小元素可能存在的范围。

  • 在每次迭代中,计算 count(mid)(小于等于 mid 的元素个数)与 k 比较,可以确定第 k 小元素位于左半区间还是右半区间。

  • 最终,left 会收敛到矩阵中的一个实际元素,且满足是第 k 小元素(详见示例验证)。

时间复杂度分析
  • 确定 min_val 和 max_val 需要O(n)时间。

  • 二分查找的迭代次数为O(logD),其中D=max_val−min_val。

  • 在每次迭代中,统计 count(mid) 需要对每一行进行一次二分查找(每行时间复杂度O(logn)),因此每次迭代的时间复杂度为O(nlogn)

  • 总时间复杂度为O(nlognlogD)

示例说明

考虑一个 2×2 矩阵:

\begin{bmatrix} 1 & 3\\ 2& 5 \end{bmatrix}

元素集合为 {1,2,3,5},排序后为 [1,2,3,5]。

  • 求第 k=2 小元素:

    • min_val = min(1, 2) = 1max_val = max(3, 5) = 5left = 1right = 5

    • 第一次迭代:mid = (1 + 5) // 2 = 3count(<=3)

      • 第一行:元素 [1,3],1≤3,3≤3,个数为 2。

      • 第二行:元素 [2,5],2≤3,5>3,个数为 1。

      • count = 2 + 1 = 3 >= 2,设置 right = 3

    • 第二次迭代:left = 1right = 3mid = (1 + 3) // 2 = 2count(<=2)

      • 第一行:1≤2,3>2,个数为 1。

      • 第二行:2≤2,5>2,个数为 1。

      • count = 1 + 1 = 2 >= 2,设置 right = 2

    • 第三次迭代:left = 1right = 2mid = (1 + 2) // 2 = 1count(<=1)

      • 第一行:1≤1,3>1,个数为 1。

      • 第二行:2>1,个数为 0。

      • count = 1 < 2,设置 left = 1 + 1 = 2

    • 循环结束,left = 2,返回 2(正确,第 2 小元素是 2)。

代码实现
def kthSmallest(matrix, k):n = len(matrix)# 初始化二分查找的边界left = matrix[0][0]              # 最小值:矩阵左上角right = matrix[n-1][n-1]         # 最大值:矩阵右下角# 二分查找while left < right:mid = (left + right) // 2count = 0                    # 统计小于等于mid的元素个数col = n - 1                 # 从每行的末尾开始检查# 遍历每一行for i in range(n):# 在当前行中,从右向左找到第一个小于等于mid的元素while col >= 0 and matrix[i][col] > mid:col -= 1count += (col + 1)       # 该行中小于等于mid的元素个数# 调整二分查找边界if count >= k:right = midelse:left = mid + 1return left# 示例测试
if __name__ == "__main__":matrix1 = [[1, 3], [2, 5]]print(kthSmallest(matrix1, 2))  # 输出: 2matrix2 = [[1, 5, 9], [10, 11, 13], [12, 13, 15]]print(kthSmallest(matrix2, 4))  # 输出: 10matrix3 = [[-5]]print(kthSmallest(matrix3, 1))  # 输出: -5

暴力解

忽略行递增条件,直接全排序:

def kth_smallest(matrix, k):n = len(matrix)# 提取所有元素到一维列表flat_list = []for i in range(n):for j in range(n):flat_list.append(matrix[i][j])# 排序列表flat_list.sort()# 返回第k小的元素(k从1开始,索引为k-1)return flat_list[k-1]
http://www.dtcms.com/wzjs/310258.html

相关文章:

  • 计算机网站建设与开发搜狗收录批量查询
  • 不锈钢餐具做外贸哪个网站好广告投放推广平台
  • 机床网站建设全媒体运营师培训
  • 网站页面设计与实现百度推广有哪些形式
  • 济南营销型网站建设百度推广登录平台
  • 南阳网站建设的公司网络营销的主要工作有哪些
  • 17网站一起做网店广州站长统计网站
  • 河北做网站电话seo教程技术优化搜索引擎
  • 无锡新区网站制作百度推广登录平台登录
  • 电子商城网站开发与设计网站关键词排名优化软件
  • 公司网站设计注意什么网站的设计流程
  • 做网站建设与推广企业东莞seo管理
  • 简单美食网站模板免费下载外贸独立站怎么建站
  • 建设一个微网站要花多少钱系统优化软件
  • 建筑公司做网站买空间多大合适网站建设开发
  • 女生做seo网站推广友情链接免费发布平台
  • 河南基安建设集团有限公司网站重庆白云seo整站优化
  • 表白二维码制作网站标题关键词优化报价
  • 网站的命名规则网站建设策划书
  • ps常用素材网站有哪些全网营销骗局揭秘
  • 淘宝客网站怎么做分销百度数据分析工具
  • 网站访客qq抓取拼多多商品关键词搜索排名
  • 小微企业网站优化要多少钱
  • 学网站建设专业前景深圳百度关键
  • 做网站没流量网页设计培训学校
  • 网站建设boss都知道东莞网络公司电话
  • 幼儿园资质做网站需要什么资质114外链
  • 沈阳公司网站制作网络营销策划书的结构
  • vs做网站连数据库app推广平台排行榜
  • 有哪些网站可以免费企业网站推广方案设计