1. 程式人生 > >二分查詢——Search a 2D Matrix

二分查詢——Search a 2D Matrix

題目:

 給定了一個矩陣,該矩陣不僅每行,每列都遞增,而且每行的首位比前行的末位數字大時,可看成一位陣列,利用二分查詢。

例如矩陣為:

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;
	}