日期:2014-05-20  浏览次数:20797 次

百度面试题 算法(一)
给定如下的n*n的数字矩阵,每行从左到右是递增, 每列的数据也是递增

1 2 3

3 5 6

4 8 9

现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)

个人思路:想现在对角线上查找,不符合在查找行和列
我的方法如下,但是运行会一直显示false,大神们可否修改下:
  public static boolean f(int[][] matrix,int i,int j,int x){ //i表示行,j表示列,x表示的题目中的数k
if(i==-1||j==-1)
return false;  
else
{
if(matrix[i][j]==x)
{
return true;
}
else if(matrix[i][j]>x)
  {
return f(matrix,i+1,j+1,x);
}
else
{
return f(matrix,i-1,j,x)||f(matrix,i,j-1,x);
}
}
  }

ps:也可以贴出自己的程序,供大家分享



------解决方案--------------------
这道题考察的应该是效率问题,我的方案是对,a[n][n],和X,先比较x与y=a[0][n-1],x<y,则与a[0][n-2]比较,x>y则与a[1][n-1]比较,这样最多是2n次,比起原始的N*N快了很多
------解决方案--------------------
简单点的话就用两次二分法来查找吧
先定位行 后定位列
------解决方案--------------------
对K先在第一行找,可以用2分法查找,有就返回
没有就肯定介于某两个数之间,就在比它小的那列中继续二分法查找,有就返回
没有同理肯定也介于两个书之间,在比它大的那行中继续二分法查找,有就返回
没有同上继续,直到找到或者返回不存在。