LintCode-Search 2D Matrix II

LiBlog發表於2014-12-30

Write an efficient algorithm that searches for a value in an m x n matrix, return the occurrence of it.

This matrix has the following properties:

    * Integers in each row are sorted from left to right.

    * Integers in each column are sorted from up to bottom.

    * No duplicate integers in each row or column.

Example

Consider the following matrix:

[

    [1, 3, 5, 7],

    [2, 4, 7, 8],

    [3, 5, 9, 10]

]

Given target = 3, return 2.

Challenge

O(m+n) time and O(1) extra space

Solution:
 1 public class Solution {
 2     /**
 3      * @param matrix: A list of lists of integers
 4      * @param: A number you want to search in the matrix
 5      * @return: An integer indicate the occurrence of target in the given matrix
 6      */
 7     public int searchMatrix(ArrayList<ArrayList<Integer>> matrix, int target) {
 8         int m = matrix.size();
 9         if (m==0) return 0;
10         int n = matrix.get(0).size();
11         if (n==0) return 0;
12         
13         return searchMatrixRecur(matrix,target,0,0,m-1,n-1);
14     }
15 
16     public int searchMatrixRecur(ArrayList<ArrayList<Integer>> matrix, int target, int x1, int y1, int x2, int y2){
17         if (x2<x1 || y2<y1) return 0;
18 
19         if (x1==x2 && y1==y2)
20             if (matrix.get(x1).get(y1)==target) return 1;
21             else return 0;
22 
23         int midX = (x1+x2)/2;
24         int midY = (y1+y2)/2;
25         int midVal = matrix.get(midX).get(midY);
26         int res = 0;
27 
28         if (midVal==target){
29             //We have to search all the four sub matrix.
30             res++;
31             res += searchMatrixRecur(matrix,target,x1,y1,midX-1,midY-1);
32             res += searchMatrixRecur(matrix,target,midX+1,midY+1,x2,y2);
33             res += searchMatrixRecur(matrix,target,(x1+x2)/2+1,y1,x2,(y1+y2)/2-1);
34             res += searchMatrixRecur(matrix,target,x1,(y1+y2)/2+1,(x1+x2)/2-1,y2);
35         } else if (midVal>target) {
36             int leftX = (x1+x2)/2;
37             int leftY = y1;
38             int upX = x1;
39             int upY = (y1+y2)/2;
40             if (target==matrix.get(leftX).get(leftY)) res++;
41             if (target==matrix.get(upX).get(upY)) res++;
42             if (target <= matrix.get(leftX).get(leftY) && target <=matrix.get(upX).get(upY)){
43                 res += searchMatrixRecur(matrix,target,x1,y1,midX-1,midY-1);
44             } else if (target <= matrix.get(leftX).get(leftY)){
45                 res += searchMatrixRecur(matrix,target,x1,y1,(x1+x2)/2-1,y2);
46             } else if (target <= matrix.get(upX).get(upY)){
47                 res += searchMatrixRecur(matrix,target,x1,y1,x2,(y1+y2)/2-1);
48             } else {
49                 res += searchMatrixRecur(matrix,target,x1,y1,x2,(y1+y2)/2-1);
50                 res += searchMatrixRecur(matrix,target,upX,upY,(x1+x2)/2-1,y2);
51             }
52         } else {
53             int rightX = (x1+x2)/2;
54             int rightY = y2;
55             int lowX = x2;
56             int lowY = (y1+y2)/2;
57             if (target==matrix.get(rightX).get(rightY)) res++;
58             if (target==matrix.get(lowX).get(lowY)) res++;
59             if (target >= matrix.get(rightX).get(rightY) && target >= matrix.get(lowX).get(lowY)){
60                 res += searchMatrixRecur(matrix,target,midX+1,midY+1,x2,y2);
61             } else if (target >= matrix.get(rightX).get(rightY)){
62                 res += searchMatrixRecur(matrix,target, (x1+x2)/2+1,y1,x2,y2);
63             } else if (target >= matrix.get(lowX).get(lowY)){
64                 res += searchMatrixRecur(matrix,target, x1, (y1+y2)/2+1, x2, y2);
65             } else {
66                 res += searchMatrixRecur(matrix,target, (x1+x2)/2+1,y1, lowX, lowY);
67                 res += searchMatrixRecur(matrix,target, x1, (y1+y2)/2+1, x2, y2);
68             }
69 
70         }
71         return res;
72     }
73 }

 

相關文章