题目描述
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
根据题意,做简易的示意图:
编程语言:C++
思路一:暴力破解,结果不通过,于是另谋它路
思路二:每一行都是有序的,可对每一行进行查找,采用二分查找算法,时间复杂度nlog2(n)
class Solution { public: bool Find(int target, vector<vector<int> > array) { bool flag = false; int row = array.size(); int col = array.size(); for(int i = 0;i < row -1;i++) { int left = 0,right = col-1; while(left <= right) { int mid = (left + right) / 2; if(array[i][mid] == target) flag = true; else if(array[i][mid] > target) left = mid+1; else right = mid - 1; } } return flag; } };
但最后报出复杂度过高问题
思路三:(来自网上大牛提供)根据提供的二维数组,从上往下,从左往右都是递增有序的规律,那么从左下或右上开始,将元素array[row][col] 与 target进行比较,(假如从左下开始)array[row][col] < target,那必在元素的右边,col++,如果array[row][col] > target,那必在元素的上面,row--
class Solution { public: bool Find(int target, vector<vector<int> > array) { int num_row = array.size(); int num_col = array[0].size(); int i,j; for(i = num_row-1,j= 0;i >= 0&&j < num_col; ) { if(array[i][j] == target) { return true; } else if(array[i][j] > target) { i--; continue; } else { j++; continue; } } return false; } };
这终于成功通过