对一个row*colunms 的二维数组进行二分查找
其中
问题描述:
对一个row*colunms 的二维数组进行二分查找其中每行每列的数满足从左到右从上到下逐渐变大
数据代码:
@Override
public void run() {
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
}
原因分析:
提示:这里填写问题的分析:
例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()和 Handler.sendMessage(),其中 obtainMessage 方式当数据量过大时,由于 MessageQuene 大小也有限,所以当 message 处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
解决方案:
提示:这里填写该问题的具体解决方案:
例如:新建一个 Message 对象,并将读取到的数据存入 Message,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();换成 mHandler.sendMessage()。
public class SearchNumber {
public static int[][] Search(int [][] arrays, int row,int columns,int target) {
//int LowRow=0;
//int HighRow=row-1;
//int LowColumns=0;
//int HighColumns=columns-1;
int Left[][]={{0,0}}; //二维数组赋值
int Right[][]=new int [1][];//二维数组赋值
Right[0][0]=row-1;
Right[0][1]=columns-1;
while(Range(Left,Right)) {
int[][] x=Mid(Left,Right,arrays,row);
int mid=arrays[x[0][0]][x[0][1]];
if(target>mid) {
//丢弃左半边
} else if(target<mid) {
//丢弃右半边
}
return x;
}
return null;
}
public static boolean Range(int[][] Left,int [][] Right) {
//区间不为0--后面指针的位置大于前面指针的位置
//传过来 两个指针----先比较是否在同一行 否 1、后面指针行数字大返回ture(区间不为0)/2、前面指针行数大 返回false(区间为0)
// 是 比较列数,后面指针列数大 返回true 否则false
if(Left [0][0]==Right[0][0]) {
if(Left[0][1] <Right[0][1]) {
return true;
}
return false;
}
if(Left [0][0]<Right[0][0]) {
return true;
}
return false;
}
public static int[][] Mid (int[][] Left,int [][] Right,int [][] arrays,int row) {
//先计算 range中间包含几个数据----三部分 Left行剩几个(列数-Left[0][1]-1)+Right行前面有几个(Right[0][1]+1)
// +差几行(Right[0][1]-Left[0][1]-1)
int num=(row-Left[0][1]-1)+(Right[0][1]+1)+(Right[0][1]-Left[0][1]-1);
//找到中间数据的位置 ----Left[行]
//返回这个数据
int midPoint=num/2;
int MidPoint[][]={{Left[0][0],Left[0][1]}};
while(midPoint!=0) {
MidPoint[0][1]++;
if(MidPoint[0][1]>row) {
MidPoint[0][0]++;
MidPoint[0][1]=0;
}
midPoint--;
}
return (MidPoint);
}
}