二维数组中的查找

来源:互联网 发布:网络测试仪使用 编辑:程序博客网 时间:2024/06/05 19:07
杨氏矩阵:每一行自左向右递增,每一列自上向下递增。
题目:输入一个杨氏矩阵和一个整数,判断这个数是在杨氏矩阵中出现。
分析:有三种时间复杂度各不相同的解法。
          第一种:遍历整个二维数组,这种方法效率最低。
          第二种:因为杨氏矩阵每行都是递增的,是有序的,我们可以先判断这个整数是否大于等于每行的第一个元素,小于等于最后一个元素。如果是的话,则对这行使用折半查找法进行查找。这种方法效率次之。
           第三种:因为每行是递增的,每列也是递增的,我们可以将这个数与最右上角的元素进行比较。如果这个数大于右上角元素,则表明这个数大于这一行元素,因此这个数只可能在这一行的下方出现,所以查找方位缩小到这一行的下方。同样的,如果这个数小于右上角元素,则表明这个数小于这一列元素,因此查找范围可以缩小到这一列的左侧。(也可以与左下角的元素进行比较)这种方式效率最高。

  1. package offer;
  2. /**
  3. *
  4. * @author taojian
  5. * @time 2017年3月24日下午2:47:32
  6. * @ClassName Test01.java
  7. * @description 在一个二维素组中,每一行按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排序,请
  8. * 完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
  9. */
  10. public class Test01 {
  11. //这个是正常的思路,但是这样的时间复杂度是O(n*n)
  12. static boolean isExitNormal(int [][]a,int n,int rows,int columns){
  13. boolean found=false;
  14. for(int i=0;i<rows;i++){
  15. for(int j=0;j<columns;j++){
  16. if(a[i][j]==n){
  17. found=true;
  18. break;
  19. }
  20. }
  21. }
  22. return found;
  23. }
  24. /**
  25. * @author taojian
  26. * @time 2017年3月24日下午3:19:48
  27. * @methodname Test01.java
  28. * @descripe 时间复杂度O(n)
  29. */
  30. static boolean isExit(int [][]a,int n,int rows ,int columns){
  31. boolean found=false;
  32. if(rows>0&&columns>0){
  33. int row=0;
  34. int colum=columns-1;
  35. while(row<rows&&colum>=0){
  36. if(a[row][colum]==n){
  37. found=true;
  38. break;
  39. }else if(a[row][colum]>n)
  40. --colum;
  41. else
  42. ++row;
  43. }
  44. }
  45. return found;
  46. }
  47. public static void main(String[] args) {
  48. int [][]a={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
  49. System.out.println(isExitNormal(a,7,4,4));
  50. System.out.println(isExit(a,7,4,4));
  51. }
  52. }


0 0
原创粉丝点击