二维数组中的查找
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方法一:对每一行元素进行二分查找。时间复杂度为O(nlog(m)),其中n为行数、m为列数;空间复杂度为O(1)。
class Solution { public: bool Find(int target, vector<vector<int> > array) { auto size = array.size(); //array的元素个数 auto elementSize = array[0].size(); //array的元素的大小 //二分查找 int low; //下界 int high; //上界 int mid; for (int i = 0; i < size; ++i) { low = 0; high = elementSize - 1; while (low <= high) { mid = low + ((high - low) >> 1); if (array[i][mid] == target) return true; else if (array[i][mid] < target) low = mid + 1; else high = mid - 1; } } return false; } };
方法二:由题目描述可知每列的元素之间也是存在关系的,那么方法一就没有利用到这个特性。如果我们从第一个元素开始查找会发现当它大于查找值时既可以向右也可以向下继续查找,那么我们可以换个角度,从右上角或者左下角开始查找就可以了。从右上角开始查找,当元素值大于查找值时向左查找,小于时向下查找。
该种方法的时间复杂度为O(m+n),空间复杂度为O(1)。
class Solution { public: bool Find(int target, vector<vector<int> > array) { auto size = array.size(); //行 auto elementSize = array[0].size(); //列 for (int i = 0, j = elementSize - 1; i < size && j >= 0; ) { if (array[i][j] == target) return true; else if (array[i][j] > target){ --j; continue; } else { ++i; continue; } } return false; } };