引子:http://www.iteye.com/topic/1118928
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
解法:
package com.anct.iteye;
public class Question {
static int seed = 0;
public static void main(String[] args) {
int[][] data = getData();
print(data);
// setSeed(data);
seed = 99;
System.out.println("seed=" + seed);
boolean exist = exist(data,0,data.length-1,seed);
System.out.println(exist);
}
//用递归来做
public static boolean exist(int[][] array,int len1 ,int len2, int aim){
//从右上角开始做,>aim 去除一列 <aim 去除一行 =aim 返回真
//int row=0,col=0;
if(len1 >=array.length || len2 <0 ){
return false;
}
if(aim < array[len1][len2]){
len2=len2-1;
//flag = exist(array,len1,len2,aim);
}else if(aim > array[len1][len2]){
len1 = len1 +1;
}else{
return true;
}
return exist(array,len1,len2,aim);
//return flag;
}
public static void setSeed(int[][] array){
int i = (int) (Math.random()*array.length);
int j = (int) (Math.random()*array.length);
seed = array[i][j];
}
/**
* 打印数据
* @param array
*/
public static void print(int[][] array){
for(int i=0; i<array.length; i ++){
for(int j =0; j<array[i].length;j++){
if(j == array[i].length-1){
System.out.print(array[i][j]);
}else{
System.out.print(array[i][j] + "\t");
}
}
System.out.println();
}
}
//第一步先获取数据
public static int[][] getData(){
//随机生成一个长度
int length = (int) (Math.random()*4 +3);
//这里只对方阵有效的算法,因此自作方阵的数据
int[][] array = new int[length][length];
for(int i = 0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
int temp = (int) (Math.random()*7 +1);
//第一行的数据全部的随机生成,但是要保证一个比一个大
if(i == 0){
//这一行的第一个数据,也是所有的第一个
if(j == 0){
array[i][j] = temp;
}else{//处理不是开头的数据
array[i][j] = array[i][j-1] + temp;
}
}else{//第一行的数据生成完成,下面的数据要参考第一行的数据来生成
//这一行的第一个数据参考上一行的第一个数据来生成
if(j == 0){
array[i][j] = array[i-1][j] + temp;
}else{//不是第一个的话就要参考上一个和前一个数据来生成
array[i][j] = Math.max(array[i][j-1], array[i-1][j]) + temp;
}
}
}
}
return array;
}
}