数据结构与算法-二维数组中的查找
时间:2022-07-22
本文章向大家介绍数据结构与算法-二维数组中的查找,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字 7,则返回 true;如果查找数字 5,由于数组不含有该数字,则返回 false。
解决思路
- 用具体的问题入手
本题以 7 为查找对象,其步骤如下: 先取右上角的数字 9,由于 9 大于要查找的 7 ,故 7 肯定不在此列,删除此列,如 (a) 所示;再取新的数字 8 ,同理 8 大于 7,不在此列,删去,此时只剩下两列,如 (b) 所示。
在剩余的两列中,右上角的 2 比 7 小,故 7 应该在 2 的下方,删除此行,如 (c) 所示;再取新的右上角的数 4,同理,7 只可能在 4 的下方,故删除此行。如 (d) 所示; 在剩余的两行两列中,再取右上角的数 7 ,此时和查找的数相同,结束,如不相同,则继续。
可以选取右上角或者左下角作为初始值,但是不能选择左上角和右下角,因为我们没办法是拿出某一行或者某一列,这样就不能缩小范围
代码实现
测试用例:
- 要查找的数在数组中
- 要查找的数字不在数组中(大于数组中所有的值,小于数组中所有的值,在某两个数字之间)
- 空数组
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
# target 要查找的数
def Find(self, target, array):
found = False # 标志位
rows = len(array)
cols = len(array[0])
if ((rows > 0) and (cols > 0)): # 边界检测
row = 0
col = cols - 1 # 从最后一列开始检查
while((row < rows) and (col >= 0)):
if array[row][col] == target: # 右上角的值与目标值相等就返回
found = True
break
elif array[row][col] > target: # 右上角的值比目标值大,去掉最后一列
col -= 1
else: # 当右上角的值比目标值小,就去掉这一行
row += 1
return found
def test1(f): # 查找的数在数组中
target = 7
arr = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
assert f.Find(target, arr) == True
def test2(f): # 空数组
target = 7
arr = [[]]
assert f.Find(target, arr) == False
def test3(f): # 查找的数不在数组中
target = 5
arr = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
assert f.Find(target, arr) == False
def Test():
f = Solution()
test1(f)
test2(f)
test3(f)
Test()
参考
- https://github.com/zhedahht/CodingInterviewChinese2
- https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 手把手教你,嘴对嘴传达------Apache日志管理日志(rotatelogs分割工具、AWStats日志分析)
- 配合JAVA的AJAX使用
- 手把手教你,嘴对嘴传达------Apache网页优化
- jQuery通过Ajax实现请求后台接口数据
- Git常规操作
- 手把手教你,嘴对嘴传达 ----源码编译安装部署LAMP平台(LAMP平台与编译安装详解,Apache,MySQL与PHP源码编译安装,LAMP平台搭建论坛)
- Vue点击切换样式
- ElementUI引入到vue项目开发
- 手把手教你,嘴对嘴传达------Apache(安全优化防盗链、隐藏版本信息)
- spring框架应用系列三:切面编程(带参数)
- 排障集锦:九九八十一难之第六难!(98)Address already in use: AH00072: make_sock: could not bind to address ::80
- Vue页面中引用自定义组件
- Vue如何引用Vant组件
- js表单验证工具包
- 手把手教你,嘴对嘴传达------Nginx网站服务(访问状态统计,基于域名,端口,IP的虚拟web主机访问)