Time: 20190918
Type: 数组

题目描述

题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路

本题应该有三种非常直观的思路。

第一种是非常暴力的的搜索。

第二种是每行按照二分搜索方式查找,逐行遍历,总共是复杂度的算法。

第三种是对问题的更细粒度的分析。直接上看,二维数组是有序的,如果随便从数组中间选取一个数,该数比target小或者大,都有两种选择。比如说小吧,那么查找方向可以向右或者下,即去找更大的数。

这样一思考,问题好像就变得复杂了。

试着固定变量,从左下角或者右上角来看。

如果是左下角,该值是列值最大,行值最小。如果比target小,则表示本列所有数值都比target小,这一列都不中用,删除本列。

如果比target大,则表示,本行所有数值都比target大,那么本行就不中用,删除本行。

题解

第一种解法:

function Find(target, array)
{
    // write code here
    console.log(array.length)
    m = array.length
    n = array[0].length
    for(i = 0; i < m; i++) {
        for(j = 0; j < n; j++) {
            if (array[i][j] == target) {
                return true
            }
        }
    }
    return false;
}
module.exports = {
    Find : Find
};

第二种解法:

function Find(target, array)
{
    // write code here

    function binarySearch(arr) {
        // 行内二分搜索,每行遍历
        low = 0;
        high = arr.length - 1;
        // 循环只做范围缩小
        while (low + 1 < high) {
            // low与high相邻时结束
            mid = Math.floor(low + (high - low) / 2);
            if (target <= arr[mid]) {
                high = mid;
            } 
            else if (target > arr[mid]) {
                low = mid;
            }
        }

        if (arr[low] == target || arr[high] == target) {
            return true;
        } else {
            return false;
        }
    }
    for (i = 0 ; i < array.length; i++) {
        res = binarySearch(array[i]);
        if(res) {
            return true;
        }
    }
    return false;
}

module.exports = {
    Find : Find
};

第三种解法

function Find(target, array)
{
    // write code here
    row = array.length - 1;
    col = 0;
    while (row >= 0 && col <= array[0].length - 1) {
        if (array[row][col] == target) {
            return true;
        }
        else if (array[row][col] < target) {
            // 当前列最大值小于target,该列删去
            col++;
        } 
        else {
            // 当前行最小值大于target,向上搜索,该行删去
            row--;
        }
    }
    return false;
}
module.exports = {
    Find : Find
};

END.