Search a 2D Matrix

Search a 2D Matrix


我的思路:

1、在一个排好序的二维数组中找目标数,返回成功或者失败。

2、二分查找,首先在列上找值,定位到哪一行之后,在行内二分查找。复杂度是log(n) + log(m)。

代码如下:

   bool searchMatrix(vector<vector<int> > &matrix, int target) {
    	int n = matrix.size();
    	int m = matrix[0].size();
    	int i = 0;
    	int j = n - 1;
    	int mid1;
    	
    	while (i <= j) {
    		mid1 = (j - i) / 2 + i;
    		if (target < matrix[mid1][0])
    			j = mid1 - 1;
    		else if (target > matrix[mid1][m - 1])
    			i = mid1 + 1;
    		else 
    		    break;
    	}
    	if (mid1 >= 0 && mid1 < n) {
        	int g = 0; 
        	int h = m - 1;
        	while (g <= h) {
        		int mid = (h - g) / 2 + g;
        		if (matrix[mid1][mid] < target)
        			g = mid + 1;
        		else if (matrix[mid1][mid] > target)
        			h = mid - 1;
        		else 
        			return true;
        	}
    	}
        return false;
    }

我的思路2:

1、剑指Offer上的第3题就是这个,看了那边的思路之后,自己写了一个,结果比上面的那个运行速度还要快。

代码如下

    bool searchMatrix(vector<vector<int> > &matrix, int target) {
        int i = 0, j = matrix[0].size() - 1;

        while (i < matrix.size() && j > -1) {
            if (matrix[i][j] > target)
                j--;
            else if (matrix[i][j] < target)
                i++;
            else
                return true;
        }
        return false;
    }


别人思路:

1、既然都是有序的,那么将二维数组看作一维的来处理,也会加快速度,而且代码会简洁很多,二维到一维的转换只需要使用除法和取余就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值