Python算法题集_搜索二维矩阵II

 Python算法题集_搜索二维矩阵II

  • 题41:搜索二维矩阵II
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【双层循环】
    • 2) 改进版一【行尾检测】
    • 3) 改进版二【对角线划分】
  • 4. 最优算法

本文为Python算法题集之一的代码示例

题41:搜索二维矩阵II

1. 示例说明

  • 编写一个高效的算法来搜索 *m* x *n* 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

    • 每行的元素从左到右升序排列。
    • 每列的元素从上到下升序排列。

    示例 1:

    img

    输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
    输出:true
    

    示例 2:

    img

    输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
    输出:false
    

    提示:

    • m == matrix.length
    • n == matrix[i].length
    • 1 <= n, m <= 300
    • -109 <= matrix[i][j] <= 109
    • 每行的所有元素从左到右升序排列
    • 每列的所有元素从上到下升序排列
    • -109 <= target <= 109

2. 题目解析

- 题意分解

  1. 本题为求排序矩阵中是否存在指定的数值
  2. 本题的主要计算有2处,1是元素遍历,2是比较计算
  3. 基本的解法是双层循环,双层遍历,必然能确认是否存在,所以基本的时间算法复杂度为O(n^2)

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 因矩阵行列均已排序,因此可以在每个数组中判断搜索范围

    2. 既可以判断左边界,也可以判断右边界

    3. 对角线的元素有个特点,左上的元素都小于等于它,右下的元素都大于等于它,可以用它控制检索范围


- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大,因此需要本地化测试解决这个问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题很难超时,超时测试用例本地生成,代码详见【4. 最优算法】

3. 代码展开

1) 标准求解【双层循环】

标准双层循环,意外性能还行,看来大家大部分代码都是这么写的,非常简洁

指标优良,超过84%在这里插入图片描述

import CheckFuncPerf as cfpdef searchMatrix_base(matrix, target) :iheight, iwidth = len(matrix), len(matrix[0])for iIdx in range(iheight):for jIdx in range(iwidth):if matrix[iIdx][jIdx] == target:return Truereturn Falseimport random,copy
matrix = []
for iIdx in range(1000):matrix.append([random.randint(0, 1000000) for x in range(1000)])
for iIdx in range(100):matrix[iIdx].sort()
sortedmatrix = [sorted(column) for column in zip(*matrix)]
iTarget = sortedmatrix[888][879]
matrixCopy = copy.deepcopy(sortedmatrix)
result = cfp.getTimeMemoryStr(searchMatrix_base, matrixCopy, iTarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 searchMatrix_base 的运行时间为 16.96 ms;内存使用量为 4.00 KB 执行结果 = True

2) 改进版一【行尾检测】

行检测最大值是否过小,有少量优化

指标优异,超越91%在这里插入图片描述

import CheckFuncPerf as cfpdef searchMatrix_ext1(matrix, target):iheight, iwidth = len(matrix), len(matrix[0])for iIdx in range(iheight):if matrix[iIdx][iwidth-1] >= target:for jIdx in range(iwidth):if matrix[iIdx][jIdx] == target:return Truereturn Falseimport random,copy
matrix = []
for iIdx in range(1000):matrix.append([random.randint(0, 1000000) for x in range(1000)])
for iIdx in range(100):matrix[iIdx].sort()
sortedmatrix = [sorted(column) for column in zip(*matrix)]
iTarget = sortedmatrix[888][879]
matrixCopy = copy.deepcopy(sortedmatrix)
result = cfp.getTimeMemoryStr(searchMatrix_ext1, matrixCopy, iTarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 searchMatrix_ext1 的运行时间为 16.95 ms;内存使用量为 0.00 KB 执行结果 = True

3) 改进版二【对角线划分】

在对角线判断可能出现区域,计算量最小,但是代码最复杂,调试时间最长,相应维护起来也会更困难;如无绝对必要,不要这么写

表现优异,超过92%在这里插入图片描述

import CheckFuncPerf as cfpdef searchMatrix_ext2(matrix, target):iheight, iwidth = len(matrix), len(matrix[0])if matrix[iheight-1][iwidth-1] < target:return Falseif matrix[0][0] > target:return Falseistart, istop, iminedge = -1, -1, min(iheight, iwidth)for iIdx in range(iminedge):if matrix[iIdx][iIdx] == target:return Trueelif matrix[iIdx][iIdx] < target:istart = iIdxelse:istop = iIdxbreakif iheight>iwidth:for iIdx in range(iwidth, iheight):if matrix[iIdx][iwidth-1] >= target:for jIdx in range(iwidth):if matrix[iIdx][jIdx] == target:return Trueelif iwidth>iheight:for iIdx in range(iheight):if matrix[iIdx][iwidth-1] >= target:for jIdx in range(iheight, iwidth):if matrix[iIdx][jIdx] == target:return Trueif istop == -1:return  Falsefor iIdx in range(0, istart+1):for jidx in range(istart, iwidth):if matrix[iIdx][jidx] == target:return Truefor iIdx in range(istart, iheight):for jidx in range(0, istop+1):if matrix[iIdx][jidx] == target:return Truefor iIdx in range(0, iwidth):if matrix[istart][iIdx] == target:return Truefor iIdx in range(0, iheight):if matrix[iIdx][istart] == target:return Truefor iIdx in range(0, iwidth):if matrix[istop][iIdx] == target:return Truefor iIdx in range(0, iheight):if matrix[iIdx][istop] == target:return Truereturn Falseimport random,copy
matrix = []
for iIdx in range(1000):matrix.append([random.randint(0, 1000000) for x in range(1000)])
for iIdx in range(100):matrix[iIdx].sort()
sortedmatrix = [sorted(column) for column in zip(*matrix)]
iTarget = sortedmatrix[888][879]
matrixCopy = copy.deepcopy(sortedmatrix)
result = cfp.getTimeMemoryStr(searchMatrix_ext2, matrixCopy, iTarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 searchMatrix_ext2 的运行时间为 3.99 ms;内存使用量为 0.00 KB 执行结果 = True

4. 最优算法

根据本地日志分析,最优算法为第3种searchMatrix_ext2

import random,copy
matrix = []
for iIdx in range(1000):matrix.append([random.randint(0, 1000000) for x in range(1000)])
for iIdx in range(100):matrix[iIdx].sort()
sortedmatrix = [sorted(column) for column in zip(*matrix)]
iTarget = sortedmatrix[888][879]
matrixCopy = copy.deepcopy(sortedmatrix)# 6种算法本地速度实测比较
函数 searchMatrix_base 的运行时间为 16.96 ms;内存使用量为 4.00 KB 执行结果 = True
函数 searchMatrix_ext1 的运行时间为 16.95 ms;内存使用量为 0.00 KB 执行结果 = True
函数 searchMatrix_ext2 的运行时间为 3.99 ms;内存使用量为 0.00 KB 执行结果 = True

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这一年让我印象深刻的bug -- 让sql选择更合理的执行过程

1 业务场景 客户需要一个报表统计工单的各种信息&#xff0c;于是我们利用公司报表平台做了一个报表导出功能。可是当我们准备上ver环境时测试反应报表导出虽然数据正确但性能不能达标&#xff0c;导出非常缓慢。于是我就开始分析报表sql。 2 问题分析 相信有过开发经验的同学…

【Vue.js设计与实现】第二篇:响应系统-阅读笔记(持续更新)

从高层设计的角度去探讨框架需要关注的问题。 系列目录&#xff1a; 标题博客第一篇&#xff1a;框架设计概览【Vue.js设计与实现】第一篇&#xff1a;框架设计概览-阅读笔记第二篇&#xff1a;响应系统【Vue.js设计与实现】第二篇&#xff1a;响应系统-阅读笔记第三篇&#x…

Java 使用 ant.jar 执行 SQL 脚本文件

Java 使用 ant.jar 执行 SQL 脚本文件&#xff0c;很简单。 在 pom.xml 中导入 ant 依赖 <dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.11</version> </dependency>sql 脚本文件…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(二)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第三章&#xff1a;分类 在第一章中&#xff0c;我提到最常见的监督学习任务是回归&#xff08;预测值&#xff09;和分类&#…

IGMP——网际组管理协议

目录 1 IGMP 1.1 IGMP 使用 IP 数据报传递其报文 1.2 IGMP 工作 第一阶段&#xff1a;加入多播组 第二阶段&#xff1a;探询组成员变化情况 1.3 IGMP 采用的一些具体措施&#xff0c;以避免增加大量开销 1 IGMP 标准 1989 年公布的 RFC 1112&#xff08;IGMPv1&#xff…

淘宝镜像到期如何切换镜像及如何安装淘宝镜像

淘宝镜像到期如何切换镜像及如何安装淘宝镜像 一、淘宝镜像到期如何切换新镜像二、第一次使用淘宝镜像如何配置镜像 一、淘宝镜像到期如何切换新镜像 清空缓存&#xff1a;npm cache clean --force切换镜像源&#xff1a;npm config set registry https://registry.npmmirror.…

你今年过年回去吗?

#过年 我是一名21岁刚毕业的大学生&#xff0c;专业是软件技术&#xff0c;主修c#&#xff0c;之前在上海实习了一年&#xff0c;正式工作后来到了深圳&#xff0c;进入了一家电商公司实习。至于我为什么转行了&#xff0c;大家懂的都懂 现在是20240203晚上19.39&#xff0c;还…

【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解

我们在 Windows 中编写 C/C 程序时&#xff0c;常用的 VS2019 是一个集成开发环境&#xff0c;包含了很多工具包。而在 Linux 下开发&#xff0c;大部分的情况下都是使用一个个独立的工具。比如&#xff1a;编写代码用 vim&#xff0c;编译代码用 gcc&#xff0c;调试代码用 gd…

景区导览系统|智能导览|景区电子导览|智慧景区导览|AI智能导览

景区/园区导览系统是必不可少的服务内容&#xff0c;可提供提供指引导航&#xff0c;讲解景点、VR游览、预约购票等服务。随着元宇宙、VR、AR等数字科技的不断发展&#xff0c;导览系统的形式也从传统的纸质地图、指示牌等形式&#xff0c;发展为如今的VR/AR智慧导览。 作为国…

详解spring6.0新特性汇总

spring6新特性汇总 part1 spring6.0新特性 spring6.0 2022年11月。新一代框架带jdk17&jakarta ee9 https://www.graalvm.org/ part2 AOP&事务 1.AOP:面向切面编程 通过预编译方式和运行期动态 代理实现程序功能的统一维护的一种技术。 使用场景&#xff1a; 权…

2011-2022省级金融科技指数(基于百度搜索指数)

本文手工整理了2011-2022年金融科技相关关键词在各个省份的百度搜索指数&#xff0c;并汇总成金融科技指数。具体步骤如下。首先&#xff0c;基于商业银行小微企业信贷业务实践&#xff0c;参考沈悦和郭品&#xff08;2015&#xff09;&#xff0c;以及盛天翔和范从来&#xff…

云上未来:探索云计算的技术变革与应用趋势

一、云计算的起源和演进 1.1 早期计算模型 在探讨云计算的起源和演进之前&#xff0c;理解早期的计算模型对于构建全面的视角至关重要。早期计算模型的发展奠定了云计算的基础&#xff0c;为其演进提供了技术和理念的支撑。 1.1.1 集中式计算模型 在计算技术的早期阶段&…

map容器的基本概念及常用成员函数

map&#xff08;字典&#xff09;的基本概念 map是一个将一个值映射到另一个值的一种数据结构。&#xff08;即两个值之间有一一对应关系&#xff09;。 map的所有元素都是pair类型&#xff0c;pair中的第一个元素称为键值&#xff08;key&#xff09;第二个元素称为实值&…

OpenAI开放新功能,可通过@一键调用任意GPTs

人工智能技术的快速发展为我们的生活带来了许多便利和创新。作为人工智能领域的重要成果之一&#xff0c;OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型在自然语言处理方面取得了巨大的突破。 近日&#xff0c;OpenAI宣布推出了GPT Mentions功能…

解析Python中HTTP代理的常见问题

在Python编程中&#xff0c;HTTP代理是一个经常被提及的概念&#xff0c;尤其在处理网络请求和爬虫时。但与此同时&#xff0c;使用HTTP代理也经常会遇到一些令人头疼的问题。接下来&#xff0c;就让我们一起解析一下Python中使用HTTP代理时常见的那些问题。 1. 代理服务器无响…

大学医学统计学搜题软件?大学生必备应用:推荐几款高效的搜题工具 #经验分享#知识分享#笔记

大学生活中&#xff0c;选择适合自己的学习工具能够提高学习效率&#xff0c;让学习更加轻松愉快。 1.灵兔搜题 这是一个公众号 搜题速度极快&#xff0c;秒级响应&#xff01;不再浪费时间&#xff0c;高效解决难题。 下方附上一些测试的试题及答案 1、拟南芥中C类基因发生…

centos7安装oracle

1 安装虚拟机 设置4G内存&#xff0c;硬盘40G 2 配置网络环境 2.1配置主机名 # vi /etc/hostname 修改为 oracle2.2 配置IP地址 # vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改 BOOTPROTO"static" ONBOOT"yes" IPADDR192.168.109.110 NETMAS…

VMware无法检测到插入的USB设备,虚拟机插拔USB无反应

原本正常使用的VMware虚拟机&#xff0c;在进行了重装软件后&#xff0c;发现虚拟机插拔USB设备都无法检测到&#xff0c;没有任何的反应和提示。 通过一系列的操作发现&#xff0c;在新安装了VMware workstation 软件后&#xff0c;存在一定的概率性会发生VMware虚拟机无法自…

java并发执行批量插入

java并发执行批量插入 1、mybatis-plus批量插入 long start System.currentTimeMillis();int num 5000; //一次批量插入的数量int j 0;for (int i 0;i<20;i){List<User> userList new ArrayList<>();while (true){j;User user new User();user.setUserP…

【论文笔记】GS++: Error Analyzing and Optimal Gaussian Splatting

原文链接&#xff1a;https://browse.arxiv.org/abs/2402.00752 1. 引言 许多基于3D高斯溅射&#xff08;3D-GS&#xff09;的方法针对稀疏视图场景的鲁棒性、性能和存储效率进行增强&#xff0c;但没有专门处理高斯投影的误差。 3D-GS以一组图像和相机通过SfM校准产生的点云…