对于一个m*n的整数矩阵,其中每一行和每一列的元素都按升序排列,设计一个高效的算法判断一个数值是否存在,并给出位置

本文介绍了一种在增序排列的二维矩阵中查找特定元素的方法。该算法通过对比目标值与当前行的首尾元素来缩小搜索范围,实现高效查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.huanchuang.arvin.vo;

public class Finder {
    private String findElement(int[][] matrix, int target) {
        int row = 0, column = 0;
        // 只要行还没有达到最大值就继续执行
        while (row < matrix.length) {
            int colMax = matrix[row].length - 1;// 用于获取矩阵每一行的最大值
            // 因为是行和列都是增序的,只要指定的数在每一行的最小值和最大值之间,就返回true
            if (matrix[row][column] <= target && matrix[row][colMax] >= target) {
                for (int i = 0; i < matrix[row].length; i++) {
                    if (matrix[row][i] == target) {
                        return "matrix[" + row + "][" + i + "]";
                    }
                }
            } else {// 否则的话就自动去下一行进行比较
                row++;
            }
        }
        return "matrix[-1][-1]";// 返回-1表示不存在
    }

    public static void main(String[] args) {
        int matrix[][] = { { 1, 2, 3 }, { 4, 5 }, { 7, 8, 9 } };
        Finder finder = new Finder();
        String location = finder.findElement(matrix, 6);
        System.out.println("位置" + location);
    }

}

 

### 分治算法设计 我们可以通过一种类似于二分查找的方式,在这个有序矩阵中寻找目标值 \( x \)。由于每行每列都是按升序排列的,我们可以利用这一特性来减少搜索范围。 #### 算法步骤: 1. **初始化**: - 将起点矩阵的右上角元素 \( M[0][n-1] \),即第 1 行、最后 1 列的位置。 2. **迭代检查**: - 如果当前元素等于 \( x \),则返回 `True` 表示找到; - 如果当前元素大于 \( x \),说明该列所有下方的元素也一定都比 \( x \) 大,因此可以排除掉整个列,向左边移动一列继续查找; - 如果当前元素小于 \( x \),说明该行左侧的所有元素也都比 \( x \) 小,因此可以直接跳过这行,向下一行移动继续查找; 3. **终止条件**: - 当指针越界(超出数组边界),则表示未找到 \( x \),返回 `False`。 这种策略有效地结合了行列顺序的特点,使得每次比较都可以缩小一半左右的有效区域,从而达到快速定位的效果。 ```python def searchMatrix(matrix, target): if not matrix or not matrix[0]: return False row = 0 # Start at the top-right corner of the matrix. col = len(matrix[0]) - 1 while row < len(matrix) and col >= 0: if matrix[row][col] == target: return True elif matrix[row][col] > target: col -= 1 # Move left to reduce column index when current element is greater than target. else: row += 1 # Move down to increase row index when current element is less than target. return False # Return false if out of bounds without finding the target value. # Example usage with a sample n*n sorted matrix (increasing order in rows & columns) matrix = [ [1 , 4 , 7 ], [8 , 9 , 15], [16, 20, 25] ] target = 20 print(searchMatrix(matrix, target)) # Output should be 'True' ``` #### 时间复杂度分析: 在这个过程中,每个步骤都会将搜索空间减半——要么减少一行,要么减少一列。对于大小为 \( n \times n \) 的矩阵来说: - 最坏的情况下,需要遍历大约 \( O(n + m) \) 次操作才能确定是否存在目标数字(其中 \( m=n \))。因为最差的情况是从第一行最后一列开始一直走到左下角或右上角其中一个位置结束。 所以整体时间复杂度为 \( O(n+m)=O(2n)\approx O(n) \), 这里简化掉了常系数项\(m\) 比例因子\(2\). 这种方法相较于暴力搜索显著提高了效率,特别适用于大型稀疏数据集场景的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值