剑指offer 二维数组中的查找
题目描述
在一个二维数组(m x n)中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解法一:由于每一行都是有序的,我们可以针对每一行进行二分查找,时间复杂度为O(mlog(n))
1 bool Find(int target, vector<vector<int> > array) { 2 int m = array.size(); 3 if (m == 0) return false; 4 int n = array[0].size(); 5 for (int i = 0; i < m; i++) { 6 int k = 0, l = n - 1; 7 while (k <= l) { 8 int mid = (l - k) / 2 + k; 9 if (array[i][mid] == target) { 10 return true; 11 } else if (array[i][mid] > target) { 12 l = mid - 1; 13 } else { 14 k = mid + 1; 15 } 16 } 17 } 18 return false;
解法二:观察发现,我们可以将target与矩阵的左下角或者右上角的元素进行比较。
拿右上角的元素来说,右上角的元素在所在行是最大的,而在所在列是最小的,因此每进行一次比较就可以去除一行或者一列,不用再进行比较。
1 class Solution { 2 public: 3 bool Find(int target, vector<vector<int> > array) { 4 bool found = false; 5 int rows = array.size(); 6 if (rows <= 0) 7 return found; 8 int columns = array[0].size(); 9 int row = 0, column = columns - 1; 10 while (row < rows && column >= 0) { 11 if (array[row][column] == target) { 12 found = true; 13 break; 14 } else if (array[row][column] > target) { 15 --column; 16 } else { 17 ++row; 18 } 19 } 20 return found; 21 } 22 };
越努力,越幸运