34
34
class Solution {
35
35
public:
36
36
37
-
38
37
bool binary_search (vector<int > &v, int target) {
39
38
int low = 0 ;
40
39
int high = v.size ()-1 ;
@@ -52,8 +51,9 @@ class Solution {
52
51
}
53
52
54
53
// using binary_search() to search each rows - slow O(n*log(n))
55
- // the run time is around 840ms for all test case
54
+ // the run time is around 140ms for all test case
56
55
bool searchMatrix01 (vector<vector<int >>& matrix, int target) {
56
+ if (matrix.size () == 0 || matrix[0 ].size ()==0 ) return false ;
57
57
for (int i=0 ; i<matrix.size (); i++){
58
58
if (target < matrix[i][0 ] ) return false ;
59
59
if (binary_search (matrix[i], target)) return true ;
@@ -63,10 +63,8 @@ class Solution {
63
63
}
64
64
65
65
66
-
67
-
68
66
// start the liner search from top right corner of matrix. - O(m+n)
69
- // the run time is around 340ms
67
+ // the run time is around 64ms
70
68
bool searchMatrix02 (vector<vector<int >>& matrix, int target) {
71
69
if (matrix.size () == 0 || matrix[0 ].size ()==0 ) return false ;
72
70
int row=0 , col = matrix[0 ].size () - 1 ;
@@ -82,7 +80,7 @@ class Solution {
82
80
return false ;
83
81
}
84
82
85
- // a bit optimization for methed 2 - the run time is 300ms
83
+ // a bit optimization for methed 2 - the run time is 68ms
86
84
bool searchMatrix021 (vector<vector<int >>& matrix, int target) {
87
85
if (matrix.size () == 0 || matrix[0 ].size ()==0 ) return false ;
88
86
int row=0 , col = matrix[0 ].size () - 1 ;
@@ -91,7 +89,7 @@ class Solution {
91
89
while ( col>=0 && target < matrix[row][col]) {
92
90
col--;
93
91
}
94
- while (row < matrix.size () && target > matrix[row][col]){
92
+ while (col >= 0 && row < matrix.size () && target > matrix[row][col]){
95
93
row++;
96
94
}
97
95
@@ -100,7 +98,7 @@ class Solution {
100
98
}
101
99
102
100
// Optimization: using binary search methed to move `low` and `row`
103
- // however , the run time is around 830ms
101
+ // However , the run time is 112ms
104
102
bool searchMatrix022 (vector<vector<int >>& matrix, int target) {
105
103
if (matrix.size () == 0 || matrix[0 ].size ()==0 ) return false ;
106
104
@@ -116,23 +114,24 @@ class Solution {
116
114
int mid = start + (end - start)/2 ;
117
115
if (target == matrix[row][mid]) return true ;
118
116
if (target > matrix[row][mid]) {
119
- col = start = mid + 1 ;
117
+ start = mid + 1 ;
120
118
}else {
121
- col = end = mid - 1 ;
119
+ end = mid - 1 ;
122
120
}
123
121
}
124
-
122
+ col = end;
125
123
}else {
126
- int start=0 , end=row ;
124
+ int start=row , end=matrix. size ()- 1 ;
127
125
while (start<=end){
128
126
int mid = start + (end - start)/2 ;
129
127
if (target == matrix[mid][col]) return true ;
130
128
if (target > matrix[mid][col]) {
131
- row = start = mid + 1 ;
129
+ start = mid + 1 ;
132
130
}else {
133
- row = end = mid -1 ;
131
+ end = mid -1 ;
134
132
}
135
133
}
134
+ row = start;
136
135
}
137
136
138
137
}
@@ -141,11 +140,9 @@ class Solution {
141
140
142
141
143
142
bool searchMatrix (vector<vector<int >>& matrix, int target) {
144
-
145
- return searchMatrix022 (matrix, target); // 840ms ??
146
- return searchMatrix021 (matrix, target); // 320ms
147
- return searchMatrix02 (matrix, target); // 340ms
148
-
149
- return searchMatrix01 (matrix, target); // 840ms
143
+ return searchMatrix022 (matrix, target); // 112ms
144
+ return searchMatrix021 (matrix, target); // 68ms
145
+ return searchMatrix02 (matrix, target); // 64ms
146
+ return searchMatrix01 (matrix, target); // 148ms
150
147
}
151
148
};
0 commit comments