题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
两种思路:
第一种,对每一行使用二分查找法进行查找,时间复杂度是O(nlogn)
第二种:从左下角或者右上角开始查找,例如从右上角开始,往左数字越来越小,往下数字越来越大,那就将target与右上角数字进行比较,如果target大,那么就往下走,如果target小,那么就往左走。
C++实现:
class Solution { public: bool Find(int target, vector<vector<int> > array) { int row = array.size(); if(row == 0) return false; int colnum = array[0].size(); int i = 0; int j = colnum-1; while(i>=0&&i<row&&j>=0&&j<colnum){ if(target == array[i][j]) return true; else if(target > array[i][j]) i++; else j--; } return false; } };
java实现二分法:
public class Solution { public boolean Find(int target, int [][] array) { int row = array.length; if(row == 0) return false; int colunm = array[0].length; int low; int high; int mid; for(int i = 0;i<row;i++){ low = 0; high = colunm-1; while(low<=high){ mid = low + (high - low)/2; if(array[i][mid] == target) return true; else if(array[i][mid]<target) low = mid + 1; else high = mid - 1; } } return false; } }