杨氏矩阵

本文详细解析了两道LeetCode题目“Search a 2D Matrix”(74)与“Search a 2D Matrix II”(240)的算法实现。首先介绍了如何通过二分查找确定目标值所在的行,然后在指定行内再次使用二分查找完成精确匹配。对于第二题,文章提供了一种更通用的方法,通过双指针分别从矩阵的第一行和最后一列开始,逐步逼近目标值。

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

Search a 2D Matrix


这里写图片描述


解题思路

这里写图片描述

  • 确定行时,是通过最后一列来求(因为:之前有一道题是求插入位置:http://blog.youkuaiyun.com/hellotomhaha/article/details/54974443 由该题知道,最终start是返回插入位置,也就是start所在位置原本数字比target大,start-1所在位置的数字比target小;所以知道本题中,最终start所指的是所在行)
  • -
bool searchMatrix(vector<vector<int> > & matrix, int target) {
    if (matrix.size()==0||matrix[0].size()==0) {
        return false;
    }
    else{
        int row_len = matrix.size();
        int col_len = matrix[0].size();
        int start=0;
        int end=row_len-1;
        int mid;
        int row;
        while (start<=end) {     //先寻找行号,在矩阵的最后一列使用二分查找
            mid = (start+end)/2;
            if (target==matrix[mid][col_len-1]) {
                return true;     //如果最后一列直接找到,则返回ture;如果没找到则返回start也就是可能所在行
            }
            else if(target<matrix[mid][col_len-1]){end=mid-1;}
            else start=mid+1;
        }
        row = start;  //可能所在行等于start,也就是对最后一列使用二分查找后start的值
        if (row<row_len) {  //当可能所在行没有越界时,对row所在行进行二分查找
            start=0;
            end = col_len-1;
            while (start<=end) {
                mid = (start+end)/2;
                if (target==matrix[row][mid]) {
                    return true;
                }
                else if(target<matrix[row][mid]){end=mid-1;}
                else start=mid+1;
            }
            return false;  //当在可能所在行没有找到时,返回false
        }
        else    //当可能所在行越界时,则说明肯定不存在,返回false
        return false;


    }
}

算法分析

这里写图片描述


杨氏矩阵 2

这里写图片描述

  • 注意与上一题的区别:
    该题中前面行的较大数字有可能大于后面行的较小数字

    思路分析

    这里写图片描述

这里写图片描述

#include <stdio.h>
#include <vector>

using namespace std;

bool searchMatrix(vector<vector<int> >& matrix, int target) {

    if(matrix.size()==0||matrix[0].size()==0){return false;}
    else{
        int i=0;                      //定义两个指针,一个为i指向第一行,一个为j指向最后一列
        int j=matrix[0].size()-1;
        while (j>=0&&i<matrix.size()) {
            //比较matrix[i][j]和target;当和target相等时则返回true;当比target大时,j指针向左移动;当比target小时,i指针向下移动
            if (matrix[i][j]==target) {//和target相等时则返回true
                return true;
            }
            else if(matrix[i][j]>target){  //当比target大时,j指针向左移动;
                j--;
            }
            else{                     //当比target小时,i指针向下移动
                i++;
            }
        }
        if (i>=matrix.size()||j<0) {     //指针i或者j越界时,返回false
            return false;
        }
        else
            return true;
    }

}

算法分析

这里写图片描述

注意:该算法也可以使用在上面一题,更具有普遍性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值