剑指offer·每行从左到右,每列从上到下(严格)递增的二维数组中,判断某个数是否存在

每行从左到右,每列从上到下(严格)递增的二维数组中,判断某个数是否存在

算法(利用有序,不断排除一行或一列,缩小范围):

  1.  规律:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束: 
  2.      * 如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行。 
  3.      * 也就是说如果要查找的数字不在数组的右上角,则每-次都在数组的查找范围中剔除)行或者一列,这样每一步都可以缩小 
  4.      * 查找的范围,直到找到要查找的数字,或者查找范围为空。 

 

数据样例: int[][] matrix = {  

  1.                 {1, 2, 8, 9},  
  2.                 {2, 4, 9, 12},  
  3.                 {4, 7, 10, 13},  
  4.                 {6, 8, 11, 15}  
  5.         };  

 

目标数字7

过程:

1、7和右上角的9比较后剔除最右边一列。得到:

  1. {1, 2, 8},  
  2. {2, 4, 9},  
  3. {4, 7, 10},  
  4. {6, 8, 11}

2、7和右上角的8比较后剔除最右边一列。得到:

  1. {1, 2},  
  2. {2, 4},  
  3. {4, 7},  
  4. {6, 8}

3、7和右上角的2比较后剔除最上边一行。得到: 

  1. {2, 4},  
  2. {4, 7},  
  3. {6, 8}

直到右上角的数字等于目标数字7.

时间复杂度: O(n)

 

算法的注意事项:如果需要输出目标数字存在的个数或所在的位置,且目标数字重复存在时,比如目标数字是4,,找到第一个数字4后,把该数字所在的行和列都剔除,继续查找。

 

优秀解答:http://blog.csdn.net/derrantcm/article/details/45330789

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值