首先是两种思路:
① 假设数组是M*N的,每一行用二分搜索,这样最坏的时间复杂度就是M*Log2N,但这种方法只用到了一个条件:从左到右有序。并不是题目希望我们的方法
② 二分思想,从左下开始遍历,或者从右上开始遍历,这样最坏的时间复杂度就是O(n),下面的代码按照左下开始:(注意:提交时一直提示段错误,思考了很久才发现,对于下面第一种代码,要先判断数组是否存在,)
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row = array.size();
int column = array[0].size();
int key_row = row-1, key_column = 0;
//判断是否存在!!!
if(row ==0 || column == 0)
return 0;
if(target < array[0][0] || target > array[row-1][column-1])
return 0;
//应用本题所给信息,从左下边开始找,为的是利用一个二分的思想
while(key_column < column && key_row >= 0){
if(target == array[key_row][key_column])
return 1;
else if(target > array[key_row][key_column])
key_column++;
else if(target < array[key_row][key_column])
key_row--;
}
return 0;
}
};
//加上下面这段代码,应该会优化一点点
if(target < array[0][0] || target > array[row-1][column-1])
return 0;