【Leetcode】Search a 2D Matrix #74

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
Integers in each row are sorted from left to right.
The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]

]


1.先对row,再对column进行二分查找

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (target < matrix[0][0]) return false;
        vector<int> larget_element_vector = matrix[matrix.size()-1];
        if (target > larget_element_vector[larget_element_vector.size()-1]) return false;
        int row_number = searchMatrixRow(matrix, target, 0, matrix.size()-1);
        return searchMatrixInRow(matrix[row_number], target, 0, matrix[row_number].size()-1);
    }

private:
	int searchMatrixRow(vector<vector<int>>& matrix, int target, int begin, int end) {
		int mid = (begin + end) / 2;
		if (begin == end)
			return begin;
		else if (target >= matrix[mid][0] && target < matrix[mid+1][0])
		{
			return mid;
		}
		else if (target < matrix[mid][0])
		{
			return searchMatrixRow(matrix, target, begin, mid - 1);
		}
		else if (target > matrix[mid][0])
		{
			return searchMatrixRow(matrix, target, mid + 1, end);
		}
	}

	bool searchMatrixInRow(vector<int> &row, int target, int begin, int end) {
		int mid = (begin + end) / 2;
		if (begin > end) return false;
		if (target > row[mid]) return searchMatrixInRow(row, target, mid+1, end);
		else if (target < row[mid]) return searchMatrixInRow(row, target, begin, end - 1);
		else return true;
	}
};

2.Elimination, 遇到element < target, 则row++;遇到element > target, 则column--

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int row = 0;
        int col = matrix[0].size()-1;
        int max_row = matrix.size();
        while(row < max_row && col >= 0) {
            if(matrix[row][col] == target) return true;
            else if (matrix[row][col] > target) col--;
            else row++;
        }
        return false;
    }
};


2可稍微改进之。因为2的算法是先move到target可能存在的row,再move到coloumn (即先下再左), 故一旦往左移动后,则不应再向下移动。若向下移动则target不存在。

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int row = 0;
        int col = matrix[0].size()-1;
        int max_row = matrix.size();
        int column_decreased = false;
        while(row < max_row && col >= 0) {
            if(matrix[row][col] == target) return true;
            else if (matrix[row][col] > target) {
                column_decreased = true;
                col--;
            }
            else {
                if(column_decreased) return false;
                else row++;
            }
        }
        return false;
    }
};

Running Time:

方法一:12 ms

方法二: 16 ms

方法三: 12 ms

方法一为log复杂度,方法二为线性复杂, 方法三则有随机算法的成分在,复杂度取决于target取值范围

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值