题解 | #二维数组中的查找#
二维数组中的查找
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; }