剑指offer:二维数组中的查找
目录
- 题目
- 解题思路
- 具体代码
题目
题目链接
剑指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:二维数组中的查找相关推荐
- python 二维数组长度_剑指offer二维数组中的查找【Java+Python】
点击上方"蓝字",关注了解更多 二维数组中的查找 1. 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序 ...
- 剑指Offer 二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路法一: * 矩阵是 ...
- 剑指offer - 二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. /* 思路 * 矩阵是 ...
- 【二分法】剑指offer:二维数组中的查找
对于二维数组中每一个一维数组,用二分查找,判断能否找到该数 leetcode专题笔记:二分法查找(1)(附leetcode题)_m0_52043808的博客-CSDN博客 代码: class Solu ...
- 隔一段时间查找一次 golang_剑指 offer-04 二维数组中的查找
算法名称:二维数组中的查找 题目内容:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- 剑指0ffer04.二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例: 现 ...
- 剑指Offer04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 相当于二叉 ...
- 剑指Offer——二维数组的查找(C语言)
题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 数据范围 二维数组中元素 ...
- [剑指Offer]5.二维数组中的查找
题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...
- 算法题001 剑指Offer 面试题三:二维数组中的查找
剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...
最新文章
- 技术总监,被判刑12年!因公司未兑现股权,愤怒植入代码,牟利333万
- 两个半小时,一份Python基础试卷,满分100,却有80%的人都不及格
- 【两种解法】1004 Counting Leaves (30 分)_27行代码AC
- 10G_Ethernet_02 10G Ethernet Subsystem 简介
- Qt-在控件上绘图的方式
- 入坑 Electron 开发跨平台桌面应用
- App ui界面设计模板素材,分分钟激活灵感
- 推荐5大开源工具,用于开发Kubernetes项目
- 最终幻想13 公布发售日期和主题曲
- WordPress更改“固定链接”后 ,页面出现404的解决方法
- 麒麟操作系统产业化项目落户天津
- 三国志战略版:Daniel_兵无常势分析
- 【JavaScript 教程】第六章 数组11— filter() :过滤数组中的元素
- WeNet 丨 WeTextProcessing
- PyGame每日一练——五子棋小游戏
- 微信小程序--图片懒加载
- buck电路上下管_BUCK电路工作原理
- PicGO+阿里云OSS或PicGO+Github+Jsdelivr搭建图床(图解)
- 硅步机器人-Shadow先进仿人灵巧手
- Redis 入门及应用 ( 七 ) 面试题
热门文章
- springboot html压缩,springboot 请求响应压缩
- java 解析http返回的xml_Java解析调用webservice服务的返回XML串详解
- Linux必懂知识大总结(上)
- 炸窝Vector简介
- C++: 06---构造函数析构函数
- 《深入理解JVM.2nd》笔记(五):调优案例分析与实战
- linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_mod_lookup
- C++primer第九章 顺序容器 9.3 顺序容器操作
- 计算机操作系统生产者和消费者模型的简单介绍
- c++面向对象高级编程 学习八 non-explicit-one-argement-ctor