二分查詢——Search a 2D Matrix
阿新 • • 發佈:2019-02-04
題目:
給定了一個矩陣,該矩陣不僅每行,每列都遞增,而且每行的首位比前行的末位數字大時,可看成一位陣列,利用二分查詢。
例如矩陣為:
int[][] data={{1, 3, 5, 7},
{10,11,16,20},
{23,30,34,50}};
二維矩陣與一維矩陣下標對應的關係:
下標為i和j的元素,data[i][j],為矩陣中的第i*cols+j(下標從0開始)個元素。
那麼,若 i*cols+j == values 反求i和j的話, i=values/cols , j=values%cols。
public boolean serchMatrix(int[][] data,int target) { if(data == null||data.length == 0||data[0].length == 0) return false; int cols=data[0].length; int left=0; int right=data.length*cols-1;//i*cols+j化簡得來 while(left < right-1) { int mid=left+(right-left)/2; if(data[mid/cols][mid%cols] == target)//求出矩陣中第mid個數在矩陣中的index return true; else if(data[mid/cols][mid%cols] < target) left=mid; else right=mid; } if(data[left/cols][left%cols] == target)//! return true; if(data[right/cols][right%cols] == target) return true; else //data[right]<target return false; }