杨氏矩阵中的查找

杨氏矩阵

杨氏矩阵中,每行元素是递增的,每列元素也是递增的。即a[i][j]<a[i+1][j]且a[i][j]<a[i][j+1]。要在这样的矩阵中查找某个数值元素的位置,复杂度可以达到o(m+n),其中n为矩阵行长度,m为矩阵列长度。

开始我想的是每一行使用二分查找,时间复杂度为O(n * logm)

看到网上使用的定位法,时间复杂度为O(n + m)

首先定位到第一行最后一个元素,如果要查找的数等于这个元素,直接返回true。如果array[i][j]>num,向前寻找,如果array[i][j] < num向下寻找。直到找到这个数

import com.gxf.util.Util;

/**杨氏矩阵查找数
 * 杨氏矩阵:从左到右递增,从上到下递增
 * 查找一个数是否在矩阵中
 * 在返回true,否则返回false
 * @author GXF
 *
 */
public class YongRec {

    public static void main(String[] args) {
        int  array[][] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        Util.showTwoDimensionArray(array);
        YongRec yongRec = new YongRec();
        
        boolean result = yongRec.findNumInArray(array, 5);
        System.out.println("result = " + result);
    } 
    
    /**
     * 这里用的定位法
     * 时间复杂度为O(m + n)
     * @param array
     * @param num
     * @return
     */
    public boolean findNumInArray(int array[][], int num){
        if(array == null || array.length == 0)
            return false;
        int i = 0;
        int j = array[0].length - 1;
        while(true){
            if(array[i][j] == num)
                return true;
            else if(j > 0 && array[i][j] > num)
                j--;
            else if(i < array.length - 1 && array[i][j] < num)
                i++;
            else 
                return false;
        }//while
    }    

}

参考:http://blog.csdn.net/huangxy10/article/details/8017765

http://blog.csdn.net/v_july_v/article/details/7085669

原文地址:https://www.cnblogs.com/luckygxf/p/4685839.html