美文网首页算法
排序矩阵查找

排序矩阵查找

作者: Timmy_zzh | 来源:发表于2021-08-13 19:26 被阅读0次
排序矩阵查找
1.题目描述
  • 给定M×N矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。
示例:现有矩阵 matrix 如下:
[
  [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]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
2.解题思路:
  • 暴力解法
    • 两层for循环遍历矩阵中每个元素,然后与目标值进行比较,相等返回true
  • 分治解法
    • 从左上到右下的遍历对角线上的元素
    • 如果元素小于目标值,则左上角区域的元素都是小于目标值的,如果对角线上的元素大于目标值,则右下角区域的元素都是大于目标值的
    • 所以目标值存在于左下角和右上角区域,继续递归从上面两个区域中进行目标值的查找
    public boolean searchMatrix_v1(int[][] matrix, int target) {
        return searchMatrixSub(matrix, target, 0, 0, matrix.length - 1, matrix[0].length - 1);
    }

    /**
     * 1。先找到区域的对角线,然后遍历对角线上的元素,进行判断
     * 下面四个参数是检索区域范围
     * @param startRow 开始行
     * @param startCol 开始列
     * @param endRow   结束行
     * @param endCol   结束列
     */
    private boolean searchMatrixSub(int[][] matrix, int target, int startRow, int startCol, int endRow, int endCol) {
        if (startRow > endRow || startCol > endCol) {
            return false;
        }
        //先判断第一个元素
        if (matrix[startRow][startCol] > target) {
            return false;
        }
        //对角线个数
        int diagonal = Math.min(endRow - startRow + 1, endCol - startCol + 1);
        for (int i = 0; i < diagonal; i++) {
            //获取对角线上的元素,并进行比较,如果当前值小于目标值,而下一个元素大于目标值,则需要进行递归左下和右上两个区域进行查找目标值
            if (matrix[startRow + i][startCol + i] == target) {
                return true;
            }
            //i == diagonal - 1 查找到对角线最后一个元素了
            if (i == diagonal - 1 || matrix[startRow + i + 1][startCol + i + 1] > target) {
                return searchMatrixSub(matrix, target, startRow, startCol + i + 1, startRow + i, endCol) ||
                        searchMatrixSub(matrix, target, startRow + i + 1, startCol, endRow, startCol + i);
            }
        }
        return false;
    }
  • 双指针解法
    • 从二维矩阵的右上角位置元素开始判断与目标值的大小
    • 如果大于目标值,则当前位置的下面区域肯定都是大于目标值的,所有需要往左移
    • 如果小于目标值,则当前位置的左边区域肯定都市小于目标值的,所以需要往下移动
    • 直到找到目标值相等的元素,或者遍历到左下角
    public boolean searchMatrix(int[][] matrix, int target) {
        int row = matrix.length, col = matrix[0].length;
        int currRow = 0;//当前行
        int currCol = col - 1;//   当前列

        while (currRow < row && currCol >= 0) {
            int currValue = matrix[currRow][currCol];
            if (currValue == target) {
                return true;
            }
            if (currValue > target) {
                currCol--;
            } else {
                currRow++;
            }
        }
        return false;
    }
3.总结
  • 题解总结
    • 从二维矩阵中查找目标值,通过使用升序特性进行解法优化
  • 分治算法
    • 通过递归方式,将处理区域不断缩小,在更小的区域内进行问题解决

相关文章

  • 排序矩阵查找

    排序矩阵查找[https://leetcode-cn.com/problems/sorted-matrix-sea...

  • 18-04-27  python3 算法笔记 003查找与排序

    查找: 顺序查找 二分查找 hash查找 排序: 冒泡排序 选择排序 插入排序希尔排序 归并排序 快速...

  • iOS中级开发面试的重点

    Runloopruntime锁多线程优化block 算法: 排序, 查找数据结构: 链表, 二叉树矩阵哈希怎么解决...

  • Go中的排序

    [TOC] 排序 Go中排序函数 一维数组排序 二维矩阵排序 2.1 m*n矩阵,按照m升序 2.2 m*n矩阵,...

  • 2.4.2 查找和排序

    排序 复习1:冒泡排序 复习2:快速排序 查找 1)顺序查找2)二分查找 3)哈希表查找4)二叉排序树查找

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • 排序查找c++

    排序算法 选择排序 顺序查找 二分查找

  • 剑指Offer.C++.code6-10

    (1)排序和查找是面试考察算法的重点,如二分查找、归并排序、快速排序等;(2)查找:顺序查找、二分查找、哈希表查找...

  • 算法 2.3 分治算法:排序矩阵查找

    题目描述 给定 M×N 矩阵,每一行、每一列都按升序排列,请编写代码找出某元素 示例:现有矩阵 matrix 如下...

  • Swift语言实现几个简单算法

    栈队列二分查找插入排序归并排序快速排序 栈 队列 二分查找 二分查找是用于快速查找到目标数据(已排序)的一种查找方...

网友评论

    本文标题:排序矩阵查找

    本文链接:https://www.haomeiwen.com/subject/cqsjbltx.html