题解 | #二维数组中的查找#
二维数组中的查找
http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e
初始解法:采用双层for循环,直接遍历数组,时间复杂度是O(row * col)
bool Find(int target, vector< vector<int> > array) {
if(array.size() == 0) return false;
if(array[0].size() == 0) return false;
int row = 0, col = n-1;
for(int row = 0 ; row < array.size(); ++row )
for(int col = 0 ; col< array[0].size(); ++col)
{
if(target == array[row][col])
{
return true;
}
}
return false;
}解法①:利用二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较,
当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--;
当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;
时间复杂度是O(row + col),当 时,O(row + col) ~ O(n)
bool Find(int target, vector< vector<int> > array) {
int m = array.size();
if(m == 0) return false;
int n = array[0].size();
if(n == 0) return false;
int row = 0, col = n-1;
while(row < m && col >= 0)
{
if(target == array[row][col])
{
return true;
}
else if(target > array[row][col])
{
++row;
}
else
--col;
}
return false;
}解法②:把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是O(nlogn)
bool Find(int target, vector< vector<int> > array) {
for(int i = 0 ; i < array.size() ; i++){
int low = 0;
int high = array[i].size()-1;
while(low <= high){
int mid = (low + high) / 2;
if(target > array[i][mid])
low = mid + 1;
else if(target < array[i][mid])
high = mid - 1;
else
return true;
}
}
return false;
}