剑指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和列数col
int 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和列数col
int row = array.size();
int col = array[0].size();
// 初始从矩阵左下方开始查找
for (int i = row - 1, j = 0; i >= 0 && j < col; ) {
// 分三种情况
// 1. 当前位置元素大于目标位置元素,位置上移一行(i--)
// 2. 当前位置元素小于目标位置元素,位置右移一列(j++)
// 3. 当前位置元素等于目标位置元素,已找到,返回true
if (target < array[i][j]) {
i--;
} else if (target > array[i][j]) {
j++;
} else {
return true;
}
}
return false;
}
};
剑指offer:二维数组中的查找的更多相关文章
- (java)剑指offer二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从 上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. pu ...
- 剑指Offer 二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路法一: * 矩阵是 ...
- 剑指Offer——二维数组中的查找
题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 分析: 因为二维数组 ...
- 剑指offer—二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 用js刷剑指offer(二维数组中的查找)
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 牛客网-剑指Offer 二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 剑指Offer_4_二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 面试题5-[剑指offer] 二维数组中的查找
题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 剑指offer--1.二维数组中的查找
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- C#版剑指Offer-001二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
随机推荐
- A的B次幂
Description 给出两个正整数A和B 请输出A的B次幂 结果可能很大,请对1000000007求模 Input A和B,两个整数均不大于10^18 Output A的B次幂对100000000 ...
- Spring框架基础2
Spring框架基础2 测试Spring的AOP思想和注解的使用 导包(在前面的基础上添加) SpringAOP名词解释 AOP编程思想:横向重复代码,纵向抽取:就是说多个地方重复的代码可以抽取出来公 ...
- Golang反射机制
Go反射机制:在编译不知道类型的情况下,可更新变量.在运行时查看值.调用方法以及直接对它们的布局进行操作. 为什么使用反射 有时需要封装统一接口对不同类型数据做处理,而这些类型可能无法共享同一个接口, ...
- Linux下Mysql5.6 二进制安装
1.1下载二进制安装包 wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.40-linux-glibc2.12-x86_64.t ...
- 实现BX的内容加上123 并把和送到寄存器AX
① 一条指令 ] ②两条指令 MOV AX,BX Tips: LEA指令与MOV指令的区别: ① MOV指令是 数据 传送指令-------传送数据 LEA指令是 有效地址 传送指令 ...
- Java OOP——第五章 异常
1. 尝试通过if-else来解决异常问题: Eg: public class Test2 { public static void main(String[] args) { ...
- Ajax上传文件/照片时报错TypeError :Illegal invocation
问题 Ajax上传文件/照片时报错TypeError :Illegal invocation 解决 网上搜索问题,错误原因可能有以下几个,依次检查: 请求类型有误,如post请求,但在后台设置的是ge ...
- FreeBSD--常用命令
FreeBSD常用命令 查看网络流量 a.systat -if 1 (1表示1s刷新屏幕一次) b.netstat 1 # Traffic 流量 peak 峰值 average 平均值 查看进程p ...
- php扩展开发-资源类型
资源类型在内核中的结构 //zend_list.h typedef struct _zend_rsrc_list_entry { void *ptr; int type; int refcount; ...
- Android 中运行时权限获取联系人信息 Demo
代码比较简单... AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <m ...