算法-4.二维数组中查找对应的数字

2020-08-07  本文已影响0人  zzq_nene

二维数组:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]

方式一

根据二维数组的最右上角为一个开始点,开始查找,判断需要查找的数字是大于当前位置上的数字还是小于,如果是大于,则向下查找,行数加1;如果是小于则向左查找,列数减1
从二维数组中查找对应的数字,判断是否存在

    /**
     * 二维数组中查找对应的数字是否存在
     * 二位数组中从左到右数字增大
     * 从上到下数字增大
     * @param target
     * @param array
     * @return
     */
    public static boolean find(int target, int[][] array) {
        if (array.length == 0 || array[0].length == 0) {
            return false;
        }
        int m = array[0].length - 1;// 列
        int n = 0;// 行
        int temp = array[n][m];// 第0行的最后一个
        while (target != temp) {
            if (m > 0 && n < array.length - 1) {
                // 如果需要查找的target大于当前找到的temp,则向下继续查找
                // 行数加1
                if (target > temp) {
                    n = n + 1;
                } else if (target < temp) {
                    // 如果需要查找的target小于当前找到的temp,则向左边查找
                    // 列数减1
                    m = m - 1;
                }
                temp = array[n][m];
            } else {
                return false;
            }
        }
        return true;
    }

方式二

遍历每一行,然后对每一行使用二分查找法。时间复杂度为O(nlogn)
二分查找的时间复杂度为O(logn),前提是有序的时候

    public static boolean find1(int target, int[][] array) {
        if (array.length == 0 || array[0].length == 0) {
            return false;
        }

        // 遍历每一行
        for (int i = 0; i < array.length; i++) {
            int low = 0;
            int height = array[i].length - 1;
            int mid = (low + height)/2;
            while (low<=height) {
                if (array[i][mid] > target) {
                    height = mid - 1;
                } else if (array[i][mid] < target) {
                    low = mid + 1;
                } else {
                    return true;
                }
            }
         }
        return false;
    }
上一篇 下一篇

猜你喜欢

热点阅读