马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
编写一个高效的算法来搜刮 m x n 矩阵 matrix 中的一个目的值 target 。该矩阵具有以下特性:
- 每行的元素从左到右升序分列。
- 每列的元素从上到下升序分列。
示例 1:
- <strong>输入:</strong>matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
- <strong>输出:</strong>true
复制代码 示例 2:
- <strong>输入:</strong>matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
- <strong>输出:</strong>false
复制代码 提示:
- m == matrix.length
- n == matrix.length
- 1 <= n, m <= 300
- -109 <= matrix[j] <= 109
- 每行的全部元素从左到右升序分列
- 每列的全部元素从上到下升序分列
- -109 <= target <= 109
思绪
由于标题说每行的全部元素从左到右升序分列和每列的全部元素从上到下升序分列
以是我们知道该数组已经是单调往下递增了,就可以明白为当前元素在(i,j)这个坐标位置,那么该元素在前(i,j)坐标位置为最大值。
那么我们就可以利用这个特点,设 x表现行,y表现列。起始 x = 0,y=m-1,要是当前元素大于target,那么我们的y只能缩小了,否则小于target,x增大,要是找到即是直接返回了
代码
- class Solution {
- public:
- bool searchMatrix(vector<vector<int>>& g, int target) {
- int n = g.size();
- int m = g[0].size();
- int x = 0, y = m-1;
- while(x<n && y>=0){
- if(g[x][y]==target) return true;
- if(g[x][y]>target) y--;
- else x++;
- }
-
- return false;
- }
- };
复制代码 |