先贴抄来的做法,完美的利用了矩阵的性质,将左下角设置为起始节点,往上的元素比自己小,往左的元素比自己大,从右上开始也是一样的想法,贴代码
1 class Solution {
2 public:
3 bool searchMatrix(vector<vector<int>>& matrix, int target)
4 {
5 int row = matrix.size()-1;
6 int column = 0;
7 while(row>=0 && column<matrix[0].size())
8 {
9 if(matrix[row][column] == target)
10 return true;
11 else if(matrix[row][column] > target)
12 {
13 row--;
14 }
15 else
16 {
17 column++;
18 }
19 }
20 return false;
21 }
22 };
做这道题的时候一直在想怎么根据元素之间的大小关系把方法简化,后来想到了根据当前元素与target之间的大小关系来划分成不同的部分,从而解决问题。就是递归的思路。对于得到的一个矩阵,对其中间列进行搜索,找到第一个大于target的元素,该元素往右往下这一子矩阵中所有元素都大于target,一定不存在target,而与该元素同一列的上个元素,其往右网上这一子矩阵中所有元素都小于target,除去这两个子矩阵,剩下两个子矩阵都有可能存在target。从而进行递归。
写了很久,但是超时了,很难过,必须贴上来,他也很不错的。
1 class Solution {
2 public:
3 vector<vector<int>> mat;
4 int tar;
5 bool search(int left,int right,int up,int down)
6 {
7 if(left>right || up>down)
8 return false;
9 if(mat[up][left] > tar || mat[down][right] < tar)
10 return false;
11 int mid = (left+right)/2;
12 int row = up;
13 while(row <= down && mat[row][mid] <= tar)
14 {
15 if(mat[row][mid] == tar)
16 return true;
17 row++;
18 }
19 if(row == up)
20 return search(left,mid-1,up,down);
21 else if(row<=down && row>up)
22 return search(left,mid-1,row,down) || search(mid+1,right,up,row-1);
23 else
24 return search(mid+1,right,up,down);
25 }
26 bool searchMatrix(vector<vector<int>>& matrix, int target)
27 {
28 mat = matrix;
29 tar = target;
30 return search(0,matrix[0].size()-1,0,matrix.size()-1);
31 }
32 };