首先我们引入开始,剑指offer上面的编程题:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
下面是第一次粗心下写出的代码:
class Solution
{
public bool Find(int target, int[][] array)
{
// write code here
for(int i =0;i<array.GetLength(0);i++)
{
foreach(var item in array[i])
{
if(item==target) return true;
}
}
return false;
}
}
代码分析:优点: 不用动脑子、什么样的二维数组都适用;缺点:纯暴力遍历二维数组,没有任何算法优化。
题目中明确说明“每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。”这就意味着本身数组已经过排序,可以采用更好的方法来进行查询。
看见上面的提示后是不是头脑中冒出很多想法,二分法,哈希法等等,这些算法都是可取的,但是要达到题目中隐含想要的最优算法,应该是发挥其有序、二维长度相同的条件。
class Solution
{
public bool Find(int target, int[][] array)
{
// write code here
int len = array.Length-1;
int i = 0;
while((len >= 0)&& (i < array[0].Length)){
if(array[len][i] > target){
len--;
}else if(array[len][i] < target){
i++;
}else{
return true;
}
}
return false;
}
}
上述代码的逻辑为:首先我们选择从左下角开始搜寻,(为什么不从左上角开始搜寻,左上角向右和向下都是递增,那么对于一个点,对于向右和向下会产生一个岔路;如果我们选择从左下脚开始搜寻的话,如果大于就向右,如果小于就向下)