每天一道LeetCode-----在有序的二维数组中查找某个元素
来源:互联网 发布:大学生逃课数据 编辑:程序博客网 时间:2024/05/19 12:29
原题链接Search a 2D Matrix
判断一个二维数组中是否存在某个值
该数组满足
- 每一行元素按从左到右递增顺序排列
- 当前行的第一个元素大于上一行的最后一个元素
假设二维数组的维度是m × n
考虑二维数组中第0行最后一列的元素matrix[i][j],即i = 0, j = n - 1
如果matrix[i][j] == target,那么直接返回就可以。
现在考虑不相等的情况,根据数组的排列情况可知
由matrix[i][j]的位置可知,在第i行,没有比matrix[i][j]大的值;在第j列,没有比matrix[i][j]小的值,即
matrix[i][j - 1] < matrix[i][j]并且matrix[i + 1][j] > matrix[i][j]
也就是说第一个比matrix[i][j]大的元素是matrix[i + 1][j],而第一个比matrix[i][j]小的元素是matrix[i][j - 1]
假设matrix[i][j] > target,那么应该找第一个比matrix[i][j]大的元素,所以跳到下一行寻找,即另i = i + 1。一旦另i = i + 1,就好比承认从第i行的第j列,第i行的第j-1列,…,第i行的第0列元素都比target小,那么就没必要在第i行上浪费时间,直接跳到下一行,把[i + 1, j]看做是二维数组第0行最后一列的位置。也就是说,现在二维数组的维度是(m - i - 1) × n,第0行最后一列的元素是matrix[i + 1][j]
假设matrix[i][j] < target,那么应该找第一个比matrix[i][j]小的元素,由上面的结论可知在j-1列,所以另j = j - 1。一旦另j = j - 1,就好比承认第i行的第j列,第i+1行的第j列,…,第m行的第j列元素都比target大,那么就可以把第j列抛弃掉,把[i, j - 1]看做是二维数组第0行最后一列的位置。也就是说,现在二维数组的维度是m × j,第0行最后一列的元素是matrix[i][j - 1]
这样,以新的起始点开始执行查找操作,程序唯一需要做的事情就是判断matrix[i][j]和target的大小,matrix[i][j]大,则j = j - 1;matrix[i][j]小,则i = i + 1
代码如下
class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty() || matrix[0].empty()) return false; int m = matrix.size(); int n = matrix[0].size(); int i = 0, j = n - 1; while(i < m && j >= 0) { if(matrix[i][j] == target) return true; /* 向左移动 */ else if(matrix[i][j] > target) --j; /* 向下移动 */ else ++i; } return false; }};
原题链接Search a 2D Matrix II
二维数组中元素的排列规则为
- 每一行的元素从左到右按递增顺序排列
- 每一列的元素从上到下按递增顺序排列
解决方法和上面一模一样
代码如下
class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty() || matrix[0].empty()) return false; int m = matrix.size(); int n = matrix[0].size(); int i = 0, j = n - 1; while(i < m && j >= 0) { if(matrix[i][j] == target) return true; /* 向左移动 */ else if(matrix[i][j] > target) --j; /* 向下移动 */ else ++i; } return false; }};
- 每天一道LeetCode-----在有序的二维数组中查找某个元素
- 每天一道LeetCode-----有序数组右移n位后查找某个元素
- 每天一道LeetCode-----从有序数组中删除重复元素
- 在查找有序二维数组中查找元素
- 每天一道LeetCode-----在字符方格中查找某个单词
- 3 - 在有序二维数组中查找元素
- (java)二维有序数组中查找元素
- 有序二维数组中查找指定元素
- 从二维数组中查找某个元素
- 有序二维数组查找元素
- 有序二维数组查找元素
- 二维有序数组中查找
- 有序二维数组中查找
- 二维有序数组中查找
- 在二维数组中查找元素
- 查找二维排序数组中是否含有某个元素
- 折半查找有序数组中的某个元素
- 折半查找------在一个升序的有序数组中查找某个具体的数字
- 机器学习实战 树回归
- vtk实现两个相同的DICOM文件同步旋转
- 珠心算测验-vijos
- 遍历聚合对象中的元素——迭代器模式(三)
- BOM导致的空白问题
- 每天一道LeetCode-----在有序的二维数组中查找某个元素
- 1045. 快速排序(25)
- python3.4写好的.py文件如何打包成exe?
- 李航·《统计学习方法》学习笔记
- 乒乓球-vijos
- python字符串连接的三种方法及其效率、适用场景详解
- 增强学习(Reinforcement Learning and Control)
- 求次大值
- ubuntu安装hadoop