[剑指Offer]二维数组中的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

输入描述

array: 待查找的二维数组 
target:查找的数字

输出描述

查找到返回true,查找不到返回false

思路一

  • 查找的方法一般就是顺序查找、二分查找、哈希表查找、二叉排序树查找。
  • 根据该二维数组的特征,即行、列有序,我们可以首先想到使用二分查找,但这里是二维数组,至少要遍历一遍数组的长度,对每一行或者每一列进行二分查找,此时的时间复杂度将近是O(nlogn),我们可以继续优化。
  • 二分查找的过程中,会产生一棵二叉判定树,二叉判定树的特点就是,左子树小于根节点,右子树大于根节点。利用这个性质,我们可以将二维数组模拟成一个二叉判定树,此时就需要找出根节点,使得左子树小于根节点,右子树大于根节点,并且它的孩子节点也符合这种特性。根据给定条件,可以看到有两个点符合要求,即左下角和右上角。
  • 以左下角来说,往上数值递减,相当于左子树,往右递增,相当于右子树。所以,我们可以定义左右两个指针,初始时指向左下角节点作为根节点,当我们需要查找的数字比当前数组节点大的时候,右指针往右移一位,当需要查找的数字小于当前节点时,左指针往上移一位。代码如下:
    public static boolean Find2(int [][] array,int target) {
        int rowsNum = array.length;//行的数量
        int colsNum = array[0].length;//列的数量
        int i = rowsNum - 1;
        int j = 0;
        while(i >= 0 && j < colsNum){
            if(array[i][j] > target){
                i--;
            }else if(array[i][j] < target){
                j++;
            }else{
                return true;
            }
        }
        return false;

}

二维数组中的查找 C++

题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

代码
  1. class Solution {
  2. public:
  3. bool Find(vector<vector<int> > array, int target) {
  4. int i, j, m, n;
  5. m = array.size();
  6. n = array[ 0].size();
  7. i = 0;
  8. j = n -1;
  9. bool flag = true;
  10. while (flag && (i <=m -1) && (j >= 0))
  11. {
  12. if ( array[i][j] > target)
  13. {
  14. j--;
  15. continue;
  16. }
  17. if ( array[i][j] < target)
  18. {
  19. i++;
  20. continue;
  21. }
  22. if ( array[i][j] == target)
  23. {
  24. flag = false;
  25. break;
  26. }
  27. }
  28. if (flag == true) return false;
  29. else return true;
  30. }
  31. };
个人总结
这里有三个地方需要注意:
1)用vector表示二位数组的表示方法:
<pre code_snippet_id="1756311" snippet_file_name="blog_20160711_1_1545247" name="code" class="cpp">vector<vector<int> > array <span style="font-family: Arial, Helvetica, sans-serif;">注意> >的之间需要有一个空格,以区分于>>。</span>
 
   
 
   
array.size()求得是行数
array[0].size()求的是列数
215行以及20行的continue必须加上,因为已经改变了i或者的j的值以后,会影响后面if语句判断array[i][j]的情况。所以必须添加continue语句。
3)注意这道题的解题思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值