目录

  • 题目
  • 解题思路
  • 具体代码

题目

题目链接
剑指offer:二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路

这题解题的关键在于数据是有序的,很自然的便想到使用二分法;在提交后在评论区发现了更优的解法(除了数据有序外,利用了数据按矩阵形式排列这一特点),会在下列代码中给出。
在使用二分法时,值得注意的是,不能将二维数组中所有元素看作单调递增排列的一维数组,从而对所有元素整体进行二分。题目仅说明数据在矩阵的每行每列各自具单调递增的性质;而行(或列)之间并没有确定的大小关系。例如,第一行可能是[4, 5, 6], 而第二行为[1, 2, 3],第二行元素可能小于第一行元素。

具体代码

1. 二分法
因为只能逐行进行二分,故算法时间复杂度为O(nlogm),n为矩阵行数,m为列数。
计算二分的中值mid时,推荐使用mid = (right - left) / 2 + left而不是mid = (left + right) / 2 ,这样能够避免加法溢出

class Solution {
public:bool Find(int target, vector<vector<int> > array) {// 求出矩阵行数row和列数colint row = array.size();int col = array[0].size();int left;int right;int mid;// 对数组逐行进行二分查找for (int i = 0; i < row; i++) {left = 0;right = col - 1;while (right >= left) {mid = (right - left) / 2 + left; // 防止left+right导致加法溢出if (array[i][mid] < target) {left = mid + 1;} else if (array[i][mid] > target) {right = mid - 1;} else {return true;}}}return false;}
};

2. 利用元素特殊的排列
利用元素排列的性质,对于左下角的元素来说,其同列上方的元素一定是小于它,其同行右方的元素一定是大于它;能够在推导的过程中跳过更多的错误元素。易知,算法时间复杂度为O(n+m)

class Solution {
public:bool Find(int target, vector<vector<int> > array) {// 求出矩阵行数row和列数colint row = array.size();int col = array[0].size();// 初始从矩阵左下方开始查找for (int i = row - 1, j = 0; i >= 0 && j < col; ) {// 分三种情况// 1. 当前位置元素大于目标位置元素,位置上移一行(i--)// 2. 当前位置元素小于目标位置元素,位置右移一列(j++)// 3. 当前位置元素等于目标位置元素,已找到,返回trueif (target < array[i][j]) {i--;} else if (target > array[i][j]) {j++;} else {return true;}}return false;}
};

转载于:https://www.cnblogs.com/Bylight/p/10440681.html

剑指offer:二维数组中的查找相关推荐

  1. python 二维数组长度_剑指offer二维数组中的查找【Java+Python】

    点击上方"蓝字",关注了解更多 二维数组中的查找 1. 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序 ...

  2. 剑指Offer 二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路法一: * 矩阵是 ...

  3. 剑指offer - 二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. /* 思路 * 矩阵是 ...

  4. 【二分法】剑指offer:二维数组中的查找

    对于二维数组中每一个一维数组,用二分查找,判断能否找到该数 leetcode专题笔记:二分法查找(1)(附leetcode题)_m0_52043808的博客-CSDN博客 代码: class Solu ...

  5. 隔一段时间查找一次 golang_剑指 offer-04 二维数组中的查找

    算法名称:二维数组中的查找 题目内容:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...

  6. 剑指0ffer04.二维数组中的查找

    在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例: 现 ...

  7. 剑指Offer04. 二维数组中的查找

    在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 相当于二叉 ...

  8. 剑指Offer——二维数组的查找(C语言)

    题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 数据范围 二维数组中元素 ...

  9. [剑指Offer]5.二维数组中的查找

    题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...

  10. 算法题001 剑指Offer 面试题三:二维数组中的查找

    剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...

最新文章

  1. 技术总监,被判刑12年!因公司未兑现股权,愤怒植入代码,牟利333万
  2. 两个半小时,一份Python基础试卷,满分100,却有80%的人都不及格
  3. 【两种解法】1004 Counting Leaves (30 分)_27行代码AC
  4. 10G_Ethernet_02 10G Ethernet Subsystem 简介
  5. Qt-在控件上绘图的方式
  6. 入坑 Electron 开发跨平台桌面应用
  7. App ui界面设计模板素材,分分钟激活灵感
  8. 推荐5大开源工具,用于开发Kubernetes项目
  9. 最终幻想13 公布发售日期和主题曲
  10. WordPress更改“固定链接”后 ,页面出现404的解决方法
  11. 麒麟操作系统产业化项目落户天津
  12. 三国志战略版:Daniel_兵无常势分析
  13. 【JavaScript 教程】第六章 数组11— filter() :过滤数组中的元素
  14. WeNet 丨 WeTextProcessing
  15. PyGame每日一练——五子棋小游戏
  16. 微信小程序--图片懒加载
  17. buck电路上下管_BUCK电路工作原理
  18. PicGO+阿里云OSS或PicGO+Github+Jsdelivr搭建图床(图解)
  19. 硅步机器人-Shadow先进仿人灵巧手
  20. Redis 入门及应用 ( 七 ) 面试题

热门文章

  1. springboot html压缩,springboot 请求响应压缩
  2. java 解析http返回的xml_Java解析调用webservice服务的返回XML串详解
  3. Linux必懂知识大总结(上)
  4. 炸窝Vector简介
  5. C++: 06---构造函数析构函数
  6. 《深入理解JVM.2nd》笔记(五):调优案例分析与实战
  7. linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_mod_lookup
  8. C++primer第九章 顺序容器 9.3 顺序容器操作
  9. 计算机操作系统生产者和消费者模型的简单介绍
  10. c++面向对象高级编程 学习八 non-explicit-one-argement-ctor