题目描述
在一个n*m 的二维数组中,每一行都按照从左到右非递减的顺序排序,每一列都按照从上到下非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例
现有矩阵 matrix 如下:
1 2 3 4 5 6 7
| [ [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 ,返回 true ,给定 target = 20,返回 false。
思路分析
对于题设中的矩阵,因为每一行非递减,每一列非递减,构成指教的一行与一列是非递减的,如第0行和第m-1列,第一行的前三个元素和和第一列的后四个元素
| 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 |
| 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 |
因此针对这样的一个非递减的直角,从右上角开始,比较角的值与目标的大小,如果大于目标值,则说明目标在角的下部分,如果大于说明再左侧。如目标为18,18>15,则15所在的行全部都小于18,所以目标18只可能在15下面的部分.
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Solution { public: bool findNumberIn2DArray(vector<vector<int>> &matrix, int target) { int n = matrix.size(); if( n == 0){ return false; } int m = matrix[0].size(); int top = 0; int right = m - 1; while (top < n && right >=0) { if (matrix[top][right] == target){ return true; } else if (matrix[top][right] > target){ right --; } else{ top ++; } } return false; } };
|
通过截图
