TypechoJoeTheme

Toasobi的博客

二维数组中的查找(中等)

本文最后更新于2023年03月02日,已超过567天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

因为上面说的是每一行非递减往右排序,我做这题的思路是先定位到给定数x所处的几行列,再两个for循环查找,我管它为优化后的暴力法。

<div>
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        int row = matrix.length;
        if(row == 0) return false;
        int cow = matrix[0].length;
        if(cow == 0) return false; //一定要注意这里的二维数组判空,这里我编译失败了好几次
                                    //这里不判空,提交[]或者[[]]会编译错误
        
        int[] line = new int[matrix.length];
        for (int i=0;i<matrix.length;i++){
            if (target >= matrix[i][0]){
                line[i] = i;
            }
        }
        for (int i=0;i<line.length;i++){
            for (int j=0;j<matrix[0].length;j++){
                if(matrix[i][j] == target){
                return true;
            }
        }
        }
        
        return false;
    }
}
</div>

当然这个说白了还是暴力,虽然测试的时候速度超过了100%

========================

- 方法二:二分查找法

<div>
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        for (int[] row : matrix) {
            int index = search(row, target);
            if (index >= 0) {
                return true;
            }
        }
        return false;
    }

    public int search(int[] nums, int target) {
        int low = 0, high = nums.length - 1;
        while (low <= high) {
            int mid = (high - low) / 2 + low;
            int num = nums[mid];
            if (num == target) {
                return mid;
            } else if (num > target) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }
}
</div>

注意二分查找法的原理,定义两个指针,每次使用int mid = (high - low) / 2 + low进行折半,然后去到mid值,通过target和mid值大小判断选择是high指针移动还是low指针移动

朗读
赞(1)
评论 (0)