本文共 2195 字,大约阅读时间需要 7 分钟。
转自:
1.1. 问题描述
在一个二维整数数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
行搜索算法(一行一行的二分搜索)
boolean rowSearch(int [][] matrix,int key) { int row = matrix.length-1,col = matrix[0].length-1; int low = 0 , high = 0,mid = 0,midVal = 0,fixMin=-1; for (int i = 0; i <= row ; i++) { if(fixMin != -1) { low = 0; high = fixMin;//如果一旦发现key列搜索算法(一列一列的二分搜索)matrix[i][i]) { low = i+1; high = col; } else if(key < matrix[i][i]) { low = 0; high = i-1; fixMin = high;//发现最小区域 } else { return true; } } while(low <= high) { mid = (low + high)>>1; midVal = matrix[i][mid]; if(key < midVal) { high = mid -1; } else if (key > midVal) { low = mid + 1; } else { return true;//发现key } } } return false;//没有发现key}
boolean colSearch(int [][] matrix,int key) { int row = matrix.length-1,col = matrix[0].length-1; int low = 0 , high = 0,mid = 0,midVal = 0,fixMin=-1; for (int i = 0; i <= col ; i++) { if(fixMin != -1) {//一旦在前一列中发现,keymatrix[i][i]) { low = i+1; high = row; } else if(key < matrix[i][i]) { low = 0; high = i-1; fixMin = high;//发现最小区域 } else { return true; } } while(low <= high) { mid = (low + high)>>1; midVal = matrix[mid][i]; if(key < midVal) { high = mid -1; } else if (key > midVal) { low = mid + 1; } else { return true;//发现key } } } return false;//没有发现key}
搜索主算法
boolean search(int [][] matrix,int key) { //比最小值小 if(keymatrix[row][col]) { return false ; } if( row < col) { //行数小于列数采用行搜索 return rowSearch(matrix, key); } else { //行数大于等于列数采用列搜索 return colSearch(matrix, key); }}
转载地址:http://rieti.baihongyu.com/