牛客网在线编程专题《剑指offer》(1)二维数组中的查找

"微信公众号"


题目连接:

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目:


解题思路:

(1)循环遍历整个二维数组,进行比较。时间复杂度为O(n^2)。

	//时间复杂度是O(n^2)
	public static boolean Find(int target,int[][] array) {
		int row = array.length;
		int col = array[row].length;
		for(int i=0; i<row; i++) {
			for(int j=0; j<col; j++) {
				if(array[i][j]==target) {
					return true;
				}
			}
		}
		return false;
	}

(2)把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是O(NlogN)。

	//时间复杂度为O(nlogn)
	public static boolean Find(int target,int[][] array) {
		int row = array.length;
		for(int i=0; i<row; i++) {
			int high = array[i].length-1;
			int low =0; 
			while(low<=high) {
				int mid = (low+high)/2;
				if(array[i][mid]==target)
					return true;
				else if(array[i][mid]<target) {
					low = mid +1;
				}else {
					high = mid -1;
				}
			}
		}
		return false;
	}

(3)由于二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较,当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--;当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;

  public boolean Find(int target, int [][] array) {
        int row = array.length;
		int col = array[0].length;
		int i = row-1;
		int j = 0;
		while(i>=0&&i<row&&j<col) {
			if(array[i][j]==target) {
				return true;
			}else if(array[i][j]>target){
					i--;
			}else {
					j++;
			}
		}
		return false;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值