从2D矩阵中查找中值,其中每行应进行排序,行和列号的乘法应为奇数

时间:2018-03-01 16:27:19

标签: java matrix binary-search median

假设一个3X3的矩阵,其元素是[{1,2,3} {3,6,6} {5,9,9}]。预期的输出是5.但是这里添加的代码显示9.由于此处的解决方案是来自互联网的副本,请帮助我理解代码。 min-max值如何帮助找到中位数和其他方法以及二进制搜索的使用。

public class Solution {
    public int binarySearch(ArrayList<Integer> arr, int x)
    {
        int l = 0, r = arr.size() - 1;
        while (l <= r)
        {
            int m = l + (r-l)/2;
            if (arr.get(m) == x)
                return m;
            if (arr.get(m) < x)
                l = m + 1;
            else
                r = m - 1;
        }
        return -1;
    }
    public int findMedian(ArrayList<ArrayList<Integer>> A) {
        int start=0;
        int end=A.size()*A.get(0).size();
        int value=-1;
        int row=A.size();
        int col=A.get(0).size();
        int max=Integer.MIN_VALUE;
        int min=Integer.MAX_VALUE;
        for(int i=0;i<A.size();i++){
            if(A.get(i).get(0)<min){
                min=A.get(i).get(0);
            }
      if(A.get(i).get(col-1)>max){
                max=A.get(i).get(col-1);
            }
        }
        int desiredIndex=(row * col+1)/2;
        while(min<max){
            int mid=min+(max-min)/2;
            int place = 0;
            int index = 0;
            for(int i = 0; i < row; ++i)
            {
                index = binarySearch(A.get(i),mid);
                System.out.println("index of : "+index);
                if(index < 0)
                    index = Math.abs(index) - 1;
                else
                {
                    while(index <A.get(i).size() && A.get(i).get(index) == mid)
                        index += 1;
                }

                place = place + index;
            }

            if (place < desiredIndex)
                min = mid + 1;
            else
                max = mid;
        }
        return min;

    }
}

1 个答案:

答案 0 :(得分:0)

我不确定您在哪里搜索,但您可以在线查找问题的解决方案:

public class MedianInRowSorted {
// function to find median in the matrix
static int binaryMedian(int m[][],int r, int c)
{
    int max = Integer.MIN_VALUE;
    int min = Integer.MAX_VALUE;

    for(int i=0; i<r ; i++)
    {

        // Finding the minimum element
        if(m[i][0] < min)
            min = m[i][0];

        // Finding the maximum element
        if(m[i][c-1] > max)
            max = m[i][c-1];
    }

    int desired = (r * c + 1) / 2;
    while(min < max)
    {
        int mid = min + (max - min) / 2;
        int place = 0;
        int get = 0;

        // Find count of elements smaller than mid
        for(int i = 0; i < r; ++i)
        {

            get = Arrays.binarySearch(m[i],mid);

            // If element is not found in the array the 
            // binarySearch() method returns 
            // (-(insertion_point) - 1). So once we know 
            // the insertion point we can find elements
            // Smaller than the searched element by the 
            // following calculation
            if(get < 0)
                get = Math.abs(get) - 1;

            // If element is found in the array it returns 
            // the index(any index in case of duplicate). So we go to last
            // index of element which will give  the number of 
            // elements smaller than the number including 
            // the searched element.
            else
            {
                while(get < m[i].length && m[i][get] == mid)
                    get += 1;
            }

            place = place + get;
        }

        if (place < desired)
            min = mid + 1;
        else
            max = mid;
    }
    return min;
}

您可以通过在main方法中运行此代码来测试它:

int matrix [][] = {{1,2,3},{3,6,6},{5,9,9}};
System.out.println(binaryMedian(matrix, 3, 3));

它将返回5,这是正确的中位数。如果您有任何问题,请告诉我,我可以更深入地了解该功能的运作方式!