二维数组查找

来源:互联网 发布:淘宝个人主页怎么看 编辑:程序博客网 时间:2024/06/14 12:21

题目:(剑指offer, page38)

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,

完成一个函数,输入一个这样的二维数组和一个整数,判断该数组中是否有该整数。


书中提供一种算法:

思路:

从数组的右上角元素开始比较,如果该元素等于要查找的元素,OK。

如果该元素大于要查找的元素,那么该元素所在的列中的所有元素一定都大于所要搜索的元素,剔除该元素所在的列。

如果该元素小于要查找的元素,那么该元素所在的行中的所有元素一定都小于所要搜索的元素,剔除该元素所在的行。

这样逐步缩小搜索范围,直到找到所要的元素,或者搜索范围为空。


Java 代码:

/** * <p> * 题目:(剑指offer, page38) * <p> * 在一个二维数组中,每一行都按照从左到右递增的顺序排序, * <p> * 每一列都按照从上到下递增的顺序排序, * <p> * 完成一个函数,输入一个这样的二维数组和一个整数,判断该数组中是否有该整数。 *  * @author likebamboo */public class ArraySearch {    /**     * 剑指offer上给出的算法     *      * @param data 数据源     * @param key 需要查找的值     * @return     */    private static boolean find1(int[][] data, int key) {        if (data == null || data.length == 0 || data[0].length == 0) {            return false;        }        // 所选择的元素的下标        int row = 0, col = data[0].length - 1;        while (row < data.length && col >= 0) {            if (data[row][col] == key) {                return true;            }            // 如果当前元素大于要查找的值,删除该元素所在的列            if (data[row][col] > key) {                col--;            } else {// 如果当前元素小于要查找的值,删除该元素所在的行                row++;            }        }        return false;    }    public static void main(String[] args) {        int[][] data = new int[][] {                {                        1, 2, 4, 6, 10                }, {                        2, 6, 8, 9, 11                }, {                        4, 7, 10, 13, 14                }, {                        6, 8, 11, 18, 20                }, {                        8, 10, 13, 20, 25                }, {                        12, 13, 17, 25, 30                }, {                        19, 22, 25, 30, 33                }, {                        20, 25, 27, 40, 41                }, {                        25, 30, 35, 44, 46                }, {                        26, 48, 45, 50, 60                }        };        int key = 41;        System.out.println(find1(data, key));    }}



原创粉丝点击