剑指offer——二维数组中的查找

题目描述

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


思路一:

根据题目可知,从array[0][0]往右或者往下都是增加,那么我们应该选择右上的顶点或者左下的顶点。因为只有这两个点,往行、列两个方向移动的时候,是一条增,一条减。而如果选择左上或者右下,那么两条路都是增或者都是减,会引起岔路。所以选择右上或者左下。

例如选择右上,则此点为array[0][array[0].length-1]。target点与该点比较,如果target大,则j++。如果target小,则i--。直到顶点转到a[i][j]与target一样大。

public class Solution {
    public boolean Find(int target, int [][] array) {
    	int row=0;
    	int col=array[0].length-1;
    	while(row<=array[0].length-1&col>=0){
    		if(target==array[row][col]){
    			return true;
    		}
    		else if(target>array[row][col]){
    				row++;
    			}
    		else{
    				col--;
    			}
    		}
    	return false;
    	}
    }
然后看了讨论区之后,还有第二个思路,是基于遍历每行,每行内进行二分查找(基于每行已经排序好)。不过这种思路没有用到每行递增的条件,个人感觉不是很好。

附上别人代码:

public class Solution {
    public boolean Find(int target, int [][] array) {
    		for(int i=0;i<array.length;i++){
    			//定义每行两端点
    			int low=0;
    			int high=array[i].length-1;
    			while(low<=high){
    				//定义中间点
    				int mid=(low+high)/2;
    				if(target<array[i][mid])
    					high=mid-1;
    				else if(target>array[i][mid])
    				  low=mid+1;	
    				else
    					return true;  				
    			}
    		}
    		return false;
    	}
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值