思路
- 多加了个 v e c t o r < v e c t o r < i n t > > vector<vector<int>> vector<vector<int>>的赋值导致一直超时,疑惑人生。
- 最简单的思路,从右上角或者左下角进行搜索,例如右上角,当 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;
// }
// };