首页 > 其他分享 >搜索二维矩阵---二分查找

搜索二维矩阵---二分查找

时间:2023-02-26 11:44:47浏览次数:53  
标签:二分 matrix 矩阵 --- 二维 查找 target

搜索二维矩阵

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-a-2d-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:二分

先查找target在哪一行,二分查找第一列即可。再在对应的行上进行二分查找。

code

class Solution {
public:
    
    //首先判断target在哪一行,也就是二分查找第一列,划分为target<=以及>target,查找小于等于target的右端点
    //再在对应的行上二分查找
    bool searchMatrix(vector<vector<int>>& matrix, int target) {

        int l = 0,r = matrix.size() -1;
        
        while(l < r)
        {
            int mid = (l + r + 1) /2;

            if(matrix[mid][0] <= target) l = mid;
            else r = mid -1;
        }
        
        //cout<<l<<endl;
        int i = 0,j = matrix[0].size();

        while(i < j)
        {
            int mid = (i + j) /2;
            if(matrix[l][mid] >= target) j = mid;
            else i = mid + 1;
        }
        
        if(l < matrix.size() && i < matrix[0].size() && matrix[l][i] == target) return true;
        else return false;

    }
};

解题思路2:一次二分查找

将一维数组映射为二维即可,就像之前写的cuda矩阵乘法一样,不是将二维数组拷贝到GPU上,而是在GPU上用一维数组模拟二维数组。这样就不用额外开空间了。

标签:二分,matrix,矩阵,---,二维,查找,target
From: https://www.cnblogs.com/huangxk23/p/17156360.html

相关文章

  • 在排序数组中查找元素的第一个和最后一个位置---二分查找
    在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果......
  • Attention 和 Self-Attention [一万字拆解 Attention,全网最详细的注意力机制讲解]
    上一篇文章从RNN到Attention我们在RNN的Encoder-Decoder框架下引入了Attention机制,用来解决RNN模型中梯度下降以及性能瓶颈问题,如下图所示:上图就是引入了Atten......
  • 搜索旋转排序数组---二分查找
    搜索旋转排序数组整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k]......
  • Jumps,cf1455b,VJ-HZNUFeb1
    (仅做为个人笔记,反思)题目意思:开始在原点,返回到达x位置的操作数操作:1.在第k轮时走到+k位置(y+k)2.走-1位置(y-1)思路:先一直选择操作1,直到y>=x。1.若等于......
  • C程序集成Backward-cpp使用示例
    原文地址:https://www.cnblogs.com/liqinglucky/p/backward-in-C.html在文章Backward-cpp:Segmentationfault时打印backtrace中已经介绍了backward-cpp的编译安装。不过......
  • 考研算法辅导课笔记:第十七讲--枚举和位运算
    这节课主要讲枚举,位运算成员函数booloperator<(constRange&b)const{};括号中的const表示参数b对象不会被修改;在函数末尾加CONST这样的函数叫常成员函数。常成员函......
  • OpenSSL 介绍(4)--非对称加密
    本文主要介绍如何使用OpenSSL来进行非对称加解密,使用的算法为RSA,DSA算法的使用方法类似;文中所使用到的软件版本:OpenSSL1.1.1s、CentOS 7.9.2009。1、非对称加密算法......
  • CDC设计实例-02
    CDC设计实例加速器假设要处理一项业务比如图像处理,有两种方向,第一种选择一些通用的处理器CPU\GPU\DSP等通用的处理器,第二种是将算法映射成IP,直接使用IP进行处理图像处理......
  • ECharts笔记--实现地图版的数据显示(存在bug/┭┮﹏┭┮/)
    相关描述前几天实现了柱状图等图的数据可视化,现在就来接着实现一下“更加”形象的数据可视化吧!具体实现如下<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/......
  • NEMU PA 3-3 实验报告
    一、实验目的在上一章PA3-2中,我们实现了分段机制,将48位的虚拟地址vaddr转换成了laddr。为什么不是paddr呢?这就要说到这一章要完成的东西:**分页机制**。从80386开始,计算......