题解 | #二维数组中的查找#

二维数组中的查找

http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e

描述:在一个二维数组array中(每个一维数组的长度相同),

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

思路:不断地收缩矩阵的边界。

具体方法:

定义四个变量代表范围,up、down、left、right.先遍历上边界,遇到比target值大的元素,right更新为当前元素的前一列。当前行遍历结束,上边界加1,即up++;再遍历左边界,遇到比target值大的元素,down更新为当前元素的上一行,当前列遍历结束,左边界加1,即left++.

alt

复杂度分析:

平均时间复杂度O(m+n),空间复杂度O(1)

public class Solution {
	public boolean Find(int target, int [][] array) {
		if (array.length==0||array[0].length==0) return false;
		int up=0,left=0;//up上边界,left左边界
        int down=array.length-1;//下边界
        int right=array[0].length-1;//右边界
        //若target比左上角元素小或者target比右下角元素大,一定找不到
        if(target<array[0][0]||target>array[down][right]) return false;
        while(true) {
        	 for(int col=left;col<=right;col++) {//遍历上边界
             	if(array[up][col]==target) return true;
             	if(array[up][col]>target) {
             		right=col-1;//右边界向左收缩
             		break;
             	}
             }
        	 up++;//上边界遍历结束,上边界向下收缩
        	 if(left>right||up>down) return false;
             for(int row=up;row<=down;row++) {//遍历左边界
             	if(array[row][left]==target) return true;
             	if(array[row][left]>target) {
             		down--;//下边界向上收缩
             		break;
             	}
             }
             left++;//左边界遍历结束,左边界向右收缩
             if(left>right||up>down) return false;
        }
       
        
    }
}
全部评论

相关推荐

求面试求offer啊啊啊啊:要求太多的没必要理
点赞 评论 收藏
分享
吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务