递增矩阵的查找

确定一个数是否存在于递增型矩阵中:

 

bool FindInMatrixFromTopRightCorner(int(*Matrix)[5], int Row, int Find)
{
    int i = 0, j = 4, tmp = Matrix[0][4];
    while (i <= 4)
    {
        if (Find > Matrix[i][j])
            i++;
        else if (Find == tmp)
        {
            cout << "Row : " << i << endl << "Line : " << j << endl;
            return true;
        }

        else
        {
            while (j >= 0)
            {
                if (Find < Matrix[i][j])
                    --j;
                else if (Find == Matrix[i][j])
                {
                    cout << "Row : " << i << endl << "Line : " << j << endl;;
                    return true;
                }
                else
                    return false;
            }
            return false;
        }
    }
    return false;
}
右上角开始查找
bool FidnInMatrixFromBottomLeftCorner(int(*Matrix)[5], int Row, int Find)
{
    int i = Row - 1, j = 0;
    while (i >= 0)
    {
        if (Find < Matrix[i][j])
            i--;
        else if (Find == Matrix[i][j])
        {
            cout << "Row : " << i << endl << "Line : " << j << endl;
            return true;
        }
        else
        {
            while (j <= 4)
            {
                if (Find > Matrix[i][j])
                    j++;
                else if (Find == Matrix[i][j])
                {
                    cout << "Row : " << i << endl << "Line : " << j << endl;
                    return true;
                }
                else
                    return false;
            }
            return false;
        }
    }
    return false;
}
左下角开始查找

 

转载于:https://www.cnblogs.com/shihaochangeworld/p/5641477.html

### 排序矩阵中使用分治法与二分查找的实现 #### 方法概述 在排序矩阵中,每行和每列都是按升序排列的。因此,可以利用这一特性来优化查找过程。通过结合分治法的思想以及二分查找的技术,可以在较短的时间内完成目标值的定位。 以下是具体的实现方法: --- #### 实现方案一:从右上角出发逐步缩小范围 这种方法的核心思想是从矩阵的右上角开始遍历,逐步排除不可能存在的区域,从而减少搜索空间。具体逻辑如下: - 如果当前元素小于目标值,则向下移动(因为该行左侧的所有元素都更小)。 - 如果当前元素大于目标值,则向左移动(因为该列下方的所有元素都更大)。 - 当前位置上的元素等于目标值时,返回 `true`;如果超出边界仍未到,则返回 `false`。 此方法虽然不完全属于传统意义上的“分治”,但它确实体现了类似的策略——不断划分可能的空间并舍弃无关部分。 ```cpp class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if (matrix.empty() || matrix[0].empty()) return false; int row = 0, col = matrix[0].size()-1; // Start from top-right corner while(row < matrix.size() && col >=0){ if(matrix[row][col]==target) return true; else if(matrix[row][col]>target) --col; // Move left else ++row; // Move down } return false; } }; ``` 上述代码实现了基于右上角起点的方法[^2]。 --- #### 实现方案二:逐行应用二分查找 由于每一行本身已经是有序序列,可以直接针对每一行执行标准的二分查找操作。这样做的时间复杂度为 O(m * log(n)) ,其中 m 表示行,n 是列的量。 下面是对应的 C++ 实现版本: ```cpp #include <algorithm> bool binarySearch(const vector<int>& nums, int target){ int l=0,r=(int)nums.size()-1; while(l<=r){ int mid=l+(r-l)/2; if(nums[mid]==target)return true; else if(nums[mid]<target)l=mid+1; else r=mid-1; } return false; } class Solution{ public: bool searchMatrix(vector<vector<int>> &matrix,int target){ for(auto& row : matrix){ if(binarySearch(row,target)){ return true; } } return false; } }; ``` 这里调用了辅助函 `binarySearch()` 来处理单个组内的二分查找工作[^3]。 --- #### 实现方案三:整体视为单一增序列表进行全局二分查找 考虑到整个二维矩阵实际上也可以看作是一个拉平后的单调递增的一维组,我们可以通过映射索引来模拟这种转换,并在此基础上实施一次完整的二分查找流程。这种方式能够达到最优性能 O(log(m*n)) 。 下面给出 Python 版本的例子: ```python def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: m,n=len(matrix),len(matrix[0]) low,high=0,m*n-1 while(low<=high): mid=(low+high)//2 val=matrix[mid//n][mid%n] if(val==target):return True elif(val<target):low=mid+1 else: high=mid-1 return False ``` 这段程序展示了如何将多维结构扁平化后再运用经典的二分技术[^4]。 --- ### 结论 以上三种方式各有优劣,在实际开发过程中可以根据具体情况灵活选用合适的算法。通常情况下推荐第三种做法因为它具备最高的效率优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值