1.二維數組中的查找
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
適用數組res來標記一行中,是否不可能。使用了一個遞歸。
public class Solution {
public static boolean Find(int [][] array,int target) {
int row_len = array.length;
System.out.println(row_len);
int col_len = array[0].length;
if(row_len*col_len ==0){
return false;
}
int[][] res =new int[row_len][2];//記錄頭和尾巴
//初始化
for(int i =0;i<row_len;i++){
res[i][0]=-1;
res[i][1]=col_len;
}
return search(res,array,row_len,col_len,target,row_len/2,col_len/2);
}
public static boolean search(int[][] res,int[][] array,int row_len,int col_len,int target,int i,int j){
if(array[i][j] > target){
//更新res中的范圍
biggerThanTarget(res,row_len,i,j);
//先左邊,再上邊
if(isOk(res,row_len,i,j-1)){
if( search(res,array,row_len,col_len,target,i,j-1))
return true;
}
if(isOk(res,row_len,i-1,j)){
if( search(res,array,row_len,col_len,target,i-1,j))
return true;
}
}else if(array[i][j] < target){
smallerThanTarget(res, i, j);
//先右邊,再下邊
if(isOk(res,row_len,i,j+1)){
if( search(res,array,row_len,col_len,target,i,j+1))
return true;
}
if(isOk(res,row_len,i+1,j)){
if( search(res,array,row_len,col_len,target,i+1,j))
return true;
}
}else{
return true;
}
return false;
}
public static boolean isOk(int[][] res,int row_len,int i,int j){
if(i==-1 || i==row_len){
return false;
}
return res[i][0] < j && res[i][1]>j;
}
public static void biggerThanTarget(int[][] res,int row_len,int i,int j){
for(int k=i; k <row_len;k++){
if( j < res[k][1]){
res[k][1] = j;
}
}
}
public static void smallerThanTarget(int[][] res,int i,int j){
for(int k=i; k >= 0;k--){
if( j > res[k][0] ){
res[k][0] = j;
}
}
}
}
public class Solution {
public boolean Find(int [][] array,int target) {
boolean found = false;
int lie = array[0].length;
int hang = array.length;
int column = lie -1;
int row =0;
while(row<hang &&column>=0){
int value = array[row][column];
if(target>value){
row++;
}else if(value>target){
column--;
}else{
found = true;
break;
}
}
return found;
}
}
看了別人的思路,覺得自己是個智障...