Java Solution using Binary Search (with comments) (96%)
\nclass Solution {\n    int[][] matrix;\n    int target;\n    public boolean searchMatrix(int[][] matrix, int target) {\n        this.matrix = matrix;\n        
```\nclass Solution {\n    int[][] matrix;\n    int target;\n    public boolean searchMatrix(int[][] matrix, int target) {\n        this.matrix = matrix;\n        this.target = target;\n        if(matrix.length==0)\n            return false;\n        return helper(0, 0, matrix.length-1, matrix[0].length-1);\n    }\n    /**\n    * @param x1, row coordinate of top left element of the matrix\n    * @param y1, column coordinate of top left elemeent of the matrix\n    * @param x2, row coordinate of bottom right element of the matrix\n    * @param y2, column coordinate of bottom right element of the matrix\n    */\n    private boolean helper(int x1, int y1, int x2, int y2){\n        if(x2<x1 || y2<y1 || x1>=matrix.length || y1>=matrix[0].length || x2<0 || y2<0)\n            return false;\n        int mx = (x2-x1)/2+x1;\n        int my = (y2-y1)/2+y1;\n        // Check the middle element of the matrix, if not found, \n        // recursively call on sub matrices where\n        // the value could still exist. \n        // You will realize that the resultant possible places will\n        // form a L shape on the original matrix.\n        // This L shape can be broken down into 2 matrices.\n        // If number found in any of the 2 matrices, we return true.\n        if(matrix[mx][my]==target)\n            return true;\n        else if(matrix[mx][my]<target){\n            return helper(x1,my+1,x2,y2) || helper(mx+1,y1,x2,my);\n        }else if(matrix[mx][my]>target){\n            return helper(x1,y1,x2,my-1) || helper(x1,my,mx-1,y2);\n        }else\n            return false;\n    }\n}\n```
[]