经典算法之二维数组中的查找问题

来源:互联网 发布:单片机电子设计与制作 编辑:程序博客网 时间: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;  }}  

总结

在前面的分析中,我们每次都选取数组查找范围内的右上角数字。同样,我们也可以选取左下角的数字。感兴趣的读者不妨自己分析一下每次都选取左下角数字的查找过程。

原创粉丝点击