二分查找:74搜索二维矩阵

74:搜索二维矩阵

思路:根据二维矩阵的定义是从左到右依次递增且这一行的第一个数大于前一行的最后一个数的思路我们可以先确定行的位置,再确定列的位置。

方法1:将二维矩阵按照行转化为一维的。

思路:首先确定循环不变量的设置,判断行的时候使用的是[up,down)的左开右闭的方式,判断列的时候使用的是[left,right]的方式。

具体实现:

1.判断在mid行:target大于等于mid行对应的最左边的位置,小于等于mid行对应的最右边的位置,结束循环。

2.判断在mid下面即[mid+1,down),此时需要比较的是大于mid行的最右侧的位置。

3.判断在mid上面即[up,mid),此时需要比较的就是小于mid行最左侧的位置。

4.边界判断:当target大于matrix的最大值或者最小值的时候,此时up为-1或者down = matrix.size()会超出边界,所以在前面结束之后需要加上一个边界判断。

5.对这一列的判断可以参考二分查找的方式(可以看二分查找),最后来确定是否存在。

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {      
        int up=0;int down=matrix.size();
        int left=0,right=matrix[0].size()-1;
        while(up<down){
            int mid=up+(down-up)/2;
            if(target>=matrix[mid][0]&&target<=matrix[mid][right]){
                up = mid;down = mid;break;
            }
            if(target<matrix[mid][0])down=mid;
            if(target>matrix[mid][right])up=mid+1;
        }
        if(up>matrix.size()-1)return false;//边界判断是否超限
        if(down<0)return false;
        cout<<up<<endl;
        while(left<=right){//这个地方改成等于号【left,right】
            int mid=left+(right-left+1)/2;
            cout<<left<<" "<<right<<" "<<mid<<" "<<matrix[up][mid]<<endl;
            if(target<matrix[up][mid])right=mid-1;//这个地方应该是要-1
            else if(target>matrix[up][mid])left=mid+1;
            else return true;
        }
        
        
    return false;
    }
};

方法2:将其展开成一个一维的数组,再进行查找

思路:由于展开之后是递增的,所以可以使用二分查找的思路来进行一个查找。

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        int n = matrix[0].size();
        int left = 0,right = m*n-1;
        if(matrix[0][0]>target||matrix[right/n][right%n]<target){
            return false;
        }
        while(left<=right){
            int mid = left+(right-left)/2;
            int number = matrix[mid/n][mid%n];
            if(number==target){
                return true;
            }else if(number<target){
                left = mid+1;
            }else{
                right = mid-1;
            }
        }
        return false;
    }
};

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你是指在一个一维矩阵(即向量)中找到某一元素所在的位置,可以使用以下方法: 1. 遍历整个向量,逐个比较元素与目标元素是否相等,直到找到目标元素,返回其位置。 2. 使用线性查找算法,从向量的中间元素开始比较,如果目标元素小于中间元素,则在向量的左半部分查找,否则在右半部分查找,直到找到目标元素或者向量为空,返回其位置或者不存在的标识。 3. 使用二分查找算法,与线性查找类似,但是每次查找都将向量分成两部分,可以更快地找到目标元素。该算法要求向量必须是有序的。 如果你是指在一个二维矩阵中找到某一元素所在的列,可以使用以下方法: 1. 遍历整个矩阵,逐行比较元素与目标元素是否相等,如果相等则返回该元素所在的列。 2. 如果二维矩阵是有序的,可以使用二分查找算法,在每行中查找目标元素,直到找到为止,返回该元素所在的列。 ### 回答2: 要在一维矩阵中找到某一元素所在的列,我们首先需要确定矩阵的行数和列数。 在一维矩阵中,元素按照一行排列,没有列的概念,因此无法通过列来定位元素。 一维矩阵可以看作是一个一行多列的矩阵,所以元素的位置只能通过索引来确定。索引是元素在矩阵中的位置标记,可以通过索引来找到某一元素所在的列。 假设我们要找到元素x在一维矩阵中所在的列。我们可以遍历整个矩阵,从第一个元素开始逐个判断是否为x。如果找到了x,则可以通过索引来确定它所在的列。 具体的方法可以是使用一个循环,从第一个元素开始逐个比较,直到找到目标元素x。在循环中,每次比较当前元素是否为x,如果是,则输出该元素的索引值,即确定了x所在的位置。 但需要注意的是,由于一维矩阵只有一行多列的特点,所以无论找到的元素在哪个位置,其所在的列始终为1。 总结来说,对于一维矩阵中找到某一元素所在的列,我们需要遍历整个矩阵,通过索引来确定元素所在的位置,但由于一维矩阵的特点,元素始终在第一列。 ### 回答3: 在一维矩阵中找到某一元素所在的列,意味着在一维矩阵中查找该元素所在的位置。 首先,我们需要遍历整个一维矩阵,从左到右逐个比较元素,直到找到目标元素。在遍历的过程中,我们可以使用一个计数器来记录当前所在的列数,初始为1。 当找到目标元素时,我们就可以得到该元素所在的列数。此时,我们可以结束遍历,将所得到的列数输出。 如果在遍历过程中没有找到目标元素,则说明目标元素不在矩阵中,我们可以输出一个特定的值,表示目标元素不存在的情况。 总结一下,找到某一元素所在的列,需要遍历一维矩阵,逐个比较元素,当找到目标元素时,记录当前的列数并输出;如果遍历完整个矩阵仍未找到目标元素,则输出表示目标元素不存在的特定值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值