Java 矩阵中查找定值

引子: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;
	}

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值