杨氏矩阵
杨氏矩阵中,每行元素是递增的,每列元素也是递增的。即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 } }