面试题 10.09. 排序矩阵查找 简单题

思路

  1. 多加了个 v e c t o r < v e c t o r < i n t > > vector<vector<int>> vector<vector<int>>的赋值导致一直超时,疑惑人生。
  2. 最简单的思路,从右上角或者左下角进行搜索,例如右上角,当 m a t r i x [ i ] [ j ] < t a r g e t matrix[i][j]<target matrix[i][j]<target时候, i + + i++ i++,否则 j − − j-- j,寻找等于的数字。

代码

class Solution {
public:
	int n, target, m;
	vector<vector<int>>matrix;
	// bool findRow(int row, int from, int to) {
	// 	if (from < 0 || from >= m || to < 0 || to >= m) {
	// 		return false;
	// 	}
	// 	if (from > to) {
	// 		return false;
	// 	}
	// 	int mid = (from + to) / 2;
	// 	if (matrix[row][mid] == target) {
	// 		return true;
	// 	}
	// 	else if (matrix[row][mid] > target) {
	// 		return findRow(row, from, mid - 1);
	// 	}
	// 	else {
	// 		return findRow(row, mid + 1, to);
	// 	}
	// 	return false;
	// }
	// bool findCol(int col, int from, int to) {
	// 	if (from < 0 || from >= n || to < 0 || to >= n) {
	// 		return false;
	// 	}
	// 	if (from > to) {
	// 		return false;
	// 	}
	// 	int mid = (from + to) / 2;
	// 	if (matrix[mid][col] == target) {
	// 		return true;
	// 	}
	// 	else if (matrix[mid][col] > target) {
	// 		return findCol(col, from, mid - 1);
	// 	}
	// 	else {
	// 		return findCol(col, mid + 1, to);
	// 	}
	// 	return false;
	// }
	// bool find(int l1, int l2, int r1, int r2) {
	// 	if (l1 < 0 || l1 >= n || l2 < 0 || l2 >= m) {
	// 		return false;
	// 	}
	// 	if (r1 < 0 || r1 >= n || r2 < 0 || r2 >= m) {
	// 		return false;
	// 	}
	// 	if (l1 > r1 || l2 > r2) {
	// 		return false;
	// 	}

	// 	int mid1 = (l1 + r1) / 2, mid2 = (l2 + r2) / 2;
	// 	if (matrix[mid1][mid2] == target) {
	// 		return true;
	// 	}
	// 	else if (matrix[mid1][mid2] > target) {
	// 		if (findRow(mid1, l2, mid2))// mid1那一行从l2那一列找到mid2哪一列
	// 		{
	// 			return true;
	// 		}
	// 		else if (findCol(mid2, l1, mid1))// mid2那一列从l1那一行找到mid1那一行
	// 		{
	// 			return true;
	// 		}
	// 		else if (find(l1, l2, mid1 - 1, mid2 - 1)) {
	// 			return true;
	// 		}
	// 		else if (find(mid1 + 1, l2, r1, mid2 - 1)) {
	// 			return true;
	// 		}
	// 		else if (find(l1, mid2 + 1, mid1 - 1, r2)) {
	// 			return true;
	// 		}
	// 	}
	// 	else {
	// 		if (findRow(mid1, mid2, r2))// mid1那一行从l2那一列找到r2那一列
	// 		{
	// 			return true;
	// 		}
	// 		else if (findCol(mid2, mid1, r1))// mid2那一列从r1那一行找到r1那一行
	// 		{
	// 			return true;
	// 		}
	// 		else if (find(l1, mid2 + 1, mid1 - 1, r2)) {
	// 			return true;
	// 		}
	// 		else if (find(mid1 + 1, l2, r1, mid2 - 1)) {
	// 			return true;
	// 		}
	// 		else if (find(mid1 + 1, mid2 + 1, r1, r2)) {
	// 			return true;
	// 		}
	// 	}
	// 	return false;
	// }
	
    // bool find1(int i,int j){
    //     if(i<0||i>=n||j<0||j>=m){
    //         return false;
    //     }
    //     if(matrix[i][j]==target){
    //         return true;
    //     }
    //     if(matrix[i][j]<target){
    //         return find1(i+1,j);
    //     }
    //     else{
    //         return find1(i,j-1);
    //     }
    //     return false;
    // }
	bool searchMatrix(vector<vector<int>>& matrix, int target) {
		n = matrix.size();
		if (n == 0) {
			return false;
		}
		m = matrix[0].size();
        if(m==0){
            return false;
        }
		// this->matrix = matrix;
		this->target = target;
		// vis.resize(matrix.size(),vector<int>(matrix[0].size()));
        if(target>matrix[n-1][m-1]||target<matrix[0][0]){
            return false;
        }
		// return find(0, 0, n - 1, m - 1);
        // return find1(0,m-1);
        // int res=0;
        // int row=0;
        // int col=m-1;
        // while(row>=0&&row<n&&col>=0&&col<m){
        //     if(matrix[row][col]==target){
        //         res=1;
        //         break;
        //     }
        //     if(matrix[row][col]<target){
        //         row++;
        //     }
        //     else{
        //         col--;
        //     }
        // }
        // return res;

        int row=n-1;
        int col=0;
        while(row>=0&&col<m){
            
            if(matrix[row][col]<target){
                col++;
            }
            else if(matrix[row][col]>target){
                row--;
            }
            else{
                return true;
            }
        }
        return false;
		
	}
};


// class Solution {
// public:
//     bool searchMatrix(vector<vector<int>>& matrix, int target) {
//         int rows = matrix.size();
//         if (rows <= 0)
//         {
//             return false;
//         }
//         int cols = matrix[0].size();
//         if (cols <= 0)
//         {
//             return false;
//         }

//         int i = rows - 1;
//         int j = 0;
//         while (i >= 0 && j < cols)
//         {
//             if (matrix[i][j] < target)
//             {
//                 ++j;
//             }
//             else if (matrix[i][j] > target)
//             {
//                 --i;
//             }
//             else
//             {
//                 // 找到结果直接返回
//                 return true;
//             }
//         }
//         return false;
//     }
// };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值