71 搜索二维矩阵

news/2025/2/12 12:13:06/

搜索二维矩阵

    • 题解1 Z字查找(tricky)
    • 题解2 一次二分查找
    • 题解3 两次二分查找

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false

在这里插入图片描述
提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • − 1 0 4 -10^4 104 <= matrix[i][j], target <= 1 0 4 10^4 104

题解1 Z字查找(tricky)

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {// z字查找的思路,适用于每行有序、每列有序的情形// 但这题的条件更强,即如果按行优先来看下标小的元素总是小于下标大的,直接二分会更快int m = matrix.size(), n = matrix[0].size();int r = 0, c = n-1;while(r >= 0 && c >= 0 && r < m && c < n){if(target > matrix[r][c]){r ++;}else if(target < matrix[r][c]){c --;}else return true;}return false;}
};

在这里插入图片描述

题解2 一次二分查找

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();// 按行合并(torch.cat(dim = 0))// 1234 2345 ...int l = 0;// 1D数组 尾下标int r = m*n-1;while(l <= r){int mid = l + (r-l)/2;// row = mid/n; column =mid%nif(matrix[mid/n][mid%n] == target) return true;else if(matrix[mid/n][mid%n] > target){r = mid-1;}else{l = mid+1;}}return false;}
};

在这里插入图片描述

题解3 两次二分查找

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {// 从第一列找第一个大于target的下标 row// 这么做是因为题目限制:每行的第一个整数大于前一行的最后一个整数auto row = upper_bound(matrix.begin(), matrix.end(), target, [](const int b, const vector<int> &a) {return b < a[0];});// 如果是第一行说明第一个数就大于target,整个matrix都大于targetif (row == matrix.begin()) {return false;}// 上一行可能有target--row;// stl 二分return binary_search(row->begin(), row->end(), target);}
};

在这里插入图片描述


http://www.ppmy.cn/news/1184642.html

相关文章

Java SE 学习笔记(十九)—— XML、设计模式

目录 1 XML1.1 XML 概述1.2 XML 语法规则1.3 XML 文档约束&#xff08;了解&#xff09;1.3.1 DTD 约束1.3.2 schema 约束 2 XML 解析2.1 XML 解析概述2.2 Dom4J 解析 XML 文件2.3 XML 解析案例 3 XML 检索4 设计模式4.1 工厂模式4.2 装饰模式 1 XML 在有些业务场景下&#xff…

[极客大挑战 2019]Havefun

1.打开链接 2.检查一下源代码 发现一段代码。 3.分析代码 <!-- $cat$_GET[cat]; echo $cat; if($catdog){ echo Syc{cat_cat_cat_cat}; } --> 询问ChatGPT&#xff1a; 从您提供的代码片段来看&#xff0c;这是…

C++快餐——C++11(1)

文章目录 背景简介统一列表初始化{}初始化initializer_lists初始化 关键字autodecltypenullptr 范围for右值引用和移动语义左值和右值左值引用和右值引用完美转发 默认成员函数总结 背景简介 C11&#xff0c;也被称为C0x&#xff08;在它被正式标准化之前的名字&#xff09;&a…

DOM节点学习

喜欢的东西太贵了&#xff0c;我一咬牙&#xff0c;狠下心决定不喜欢了&#xff01; 【文档节点--DOM有哪些节点】 仔细看下面文档的html标签的不同 1.li标签没换行 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"&…

大模型分布式并行技术--数据并行

数据并行是最常见的并行形式&#xff0c; 因为它很简单。在数据并行训练中&#xff0c; 数据集被分割成几个碎片&#xff0c; 每个碎片被 分配到一个设备上。这相当于沿批次(Batch) 维度对训练过程进行并行化。每个设备将持有一个完整的模型副 本&#xff0c; 并在分配的数据集…

pytorch 笔记:index_select

1 基本使用方法 index_select 是 PyTorch 中的一个非常有用的函数&#xff0c;允许从给定的维度中选择指定索引的张量值 torch.index_select(input, dim, index, outNone) -> Tensorinput从中选择数据的源张量dim从中选择数据的维度index 一个 1D 张量&#xff0c;包含你想…

Leetcode 2915. Length of the Longest Subsequence That Sums to Target

Leetcode 2915. Length of the Longest Subsequence That Sums to Target 1. 解题思路2. 代码实现 题目链接&#xff1a;2915. Length of the Longest Subsequence That Sums to Target 1. 解题思路 这一题其实就是一个动态规划的题目&#xff0c;本身没啥难的&#xff0c;只…

初识HTML超文本标记语言

文章目录 前端简介引入前端三剑客什么是HTML&#xff1f;超文本传输协议前戏HTTP超文本传输协议1.什么是HTTP协议2.四大特性3.数据格式4.响应状态码 基于HTTP协议搭建HTMLHTML简介HTML文档结构head常见标签1.meta 定义网页源信息(很多配置)2.style内部支持编写CSS代码3.link引入…