经典算法之二维数组中的查找问题
来源:互联网 发布:单片机电子设计与制作 编辑:程序博客网 时间:2024/06/05 16:47
前言
数组可以说是是最简单的一种数据结构,它占据一块连续的内存并按照顺序存储数据结构。创建数组时,我们需要首先指定数组的容量大小,然后根据大小分配内存。即使我们只在数组中存储一个数字,也需要为所有的数据预先分配内存。因此数组的空间效率不是很好,经常会有空闲的区域没有得到充分利用。
由于数组中的内存是连续的,于是可以根据下标在O(1)时间读/写任何元素,因此时间效率是很高的。我们可以根据数组时间效率高的优点,用数组来实现简单的哈希表:把数组的下标设为哈希表的键值(Key),而把数组中的每一个数字设为哈希表的值(Value),这样每一个下标及数组中该下标对应的数字就组成了一个“键值-值”的配对。有了这样的哈希表,我们就可以在O(1)时间内实现查找,从而快速,高效地解决很多问题。
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路分析
通过对题目的分析,我们不难发现如下规律:首先选取数组中右上角的数字。如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则剔除这个数字所在的列;如果该数字小于要查找的数字,则剔除这个数字所在的行。也就是说,如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查出范围为空。(选左下角的数字作为参考点,可以同理推导出规律)
代码实现
C++代码
class solution{public :bool Find(int target,int vector<vector<int>> array){if(arr.size()!=0){int row=0; //第一行int col=array[0].size()-1; //最后一列while(row<array.size()&&col>=0){ if(array[row][col]==target){ //如果该值为目标数,则return truereturn true;else if(array[row][col]>target) //如果该值大于目标数,则剔除一列--col;else //否则该值小于目标数,则增加一行++row; }}return false; }}
JAVA代码
public class Solution{public boolean Find(int target,int[][] array){int i=0;int j=array.length-1;while((j>=0)&&(i<array[0].length)){if(array[i][j]>target){ //如果该值大于目标值,则剔除一列j--;}else if(array[i][j]<target){ //如果该值小于目标值,则增加一行i++;}else{return true; }}return false; }}
总结
在前面的分析中,我们每次都选取数组查找范围内的右上角数字。同样,我们也可以选取左下角的数字。感兴趣的读者不妨自己分析一下每次都选取左下角数字的查找过程。
- 经典算法之二维数组中的查找问题
- 算法学习之二维数组中的查找
- 算法学习之二维数组中的查找
- 【算法】二维数组中的查找
- 算法-二维数组中的查找
- 二维数组中的查找问题
- 剑指Offer算法实现之三:二维数组中的查找
- 算法练习一:二维数组中的查找
- 【算法训练营】二维数组中的查找
- C++算法之 二维数组的查找
- 算法题之-二维数组元素查找
- 算法练习之二维数组的查找
- 二维数组中的查找 之 二分法
- 二维数组中的查找 之 二分法
- 剑指offer之二维数组中的查找
- 剑指Offer之二维数组中的查找
- 剑指Offer之 - 二维数组中的查找
- 剑指offer之二维数组中的查找
- 面向新手的Web服务器搭建(一)——IIS的搭建
- 《数据结构与算法-Python语言描述》读书笔记(8)第8章字典和集合(关键词:数据结构/算法/Python/字典/集合)
- 【Noip模拟】RP字符串
- 通信原理
- java 异常处理 Throwable Error 和Exception
- 经典算法之二维数组中的查找问题
- HDOJ2059龟兔赛跑
- Docker--创建ssh远程镜像
- linux笔记
- android控件之AutoCompleteTextView下拉列表显示一片空白
- Java垃圾回收机制
- maven基础配置
- VMware vSphere Web Services SDK编程指南(十一)- 11.1 vSphere Networks
- SQl数据