查找有序二维数组中是否包含特定值

来源:互联网 发布:excel数据透视表命名 编辑:程序博客网 时间:2024/05/17 22:18

需求:

    给定一个整型二维数组,每一行是递增顺序,每一列是递增顺序,查找其中是否包含某个指定数值

分析:

    1、根据二维数组大小分布情况可知,二维数组的右下角是最大值,左上角是最小值,左下角和右上角是中间值,并且数的增长方向是单一的,可以将左下角或者右上角作为比较标准。如果目标值比左下角小,那么一定在最左边列中,如果比左下角大,那么一定在右边的列中,列数减少。如果目标值比右上角小,那么一定在左边的列中,如果比右上角大,那么一定在最右边列中,行数增加。

    2、类似于二分法的思想,和中间值比较,右上角是第一行和最后一列的中间值,左下角是第一列和最后一行的中间值。以左下角或者右上角为初始比较对象,如果和目标值相同就返回true,如果不相同,行数和列数做相应的增加或减少。

    3、要保证查找顺序是单向的:

    对于以右上角为参考值来说,遍历方向是←或↓,没有上和右。如果目标值比参考值大,那么向下遍历,如果目标值比参考值小,那么向左遍历;

    对于以左下角为参考值来说,遍历方向是→或↑,没有下和左。如果目标值比参考值大,就向右遍历,如果目标值比参考值小,那么向上遍历。

代码:

import java.util.*;class FindNum{//给定一个整型二维数组,判断是否包含某目标值public static boolean containsNum(int[][] arr, int target){//判断该数组是否是有效的数组if(arr == null || arr.length == 0){return false;}//求该数组的行和列int row = arr.length, col = arr[0].length;//以右上角为初始参考值/*int i = 0, j = col-1;while(i < row && j >= 0){if(arr[i][j] == target){return true;}else if(arr[i][j] < target){i++;//如果目标值比当前值大,那么行数增加}else{j--;//如果目标值比当前值小,那么列数减少}}*///以左下角为初始参考值int i = row-1, j = 0;while(i >= 0 && j < col){if(arr[i][j] == target){return true;}else if(arr[i][j] < target){j++;}else{i--;}}return false;}public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("请输入数组的行数:");int row = scan.nextInt();System.out.println("请输入数组的列数:");int col = scan.nextInt();//创建一个新的整型二维数组int[][] arr = new int[row][col];//循环键入该数组for(int i = 0; i < row; i++){System.out.println("请输入第"+(i+1)+"行数据");for(int j = 0; j < col; j++){arr[i][j] = scan.nextInt();}}System.out.println("请输入目标值:");int target = scan.nextInt();System.out.println("数组是否包含目标值:"+containsNum(arr, target));}}



原创粉丝点击