LeetCode 240. Search a 2D Matrix II 解题报告
题目描述
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
1. Integers in each row are sorted in ascending from left to right.
2. Integers in each column are sorted in ascending from top to bottom.
示例
Example :
Consider the following matrix:
Given target = 5, return true.
Given target = 20, return false.
注意事项
没有明确给出。
解题思路
我的思路:
这道题用到分治的思想,然而怎么进行将问题分为更小的问题直接影响到解决的效率,所以应用分治法时,关键还是找对分的方法。
一开始我的想法每次挑取中间的元素,如果中间的元素比目标元素要大,那么以中间元素为界的右下角的区域就可以直接去除,剩下的是区域再划分成两个子区域进行搜素。然而提交的结果是超时,显然是分的方法出了问题。
正确的划分子问题的方法应该挑取右上角的元素进行比较,如果右上角元素大于目标元素,根据题目矩阵的性质可以知道右上角元素所在列都可以排除,如果右上角元素小于目标元素,同样根据题目给出的矩阵性质可知右上角元素所在行都可以排除,当右上角元素等于目标元素直接返回结果就行,因此算法实现时就是用两个变量row和col表示右上角元素的下标,初始时,row=0,col=matrix[0].size() - 1,当右上角元素大于目标元素,就减少col的值表示排除最右一列,当右上角元素小于目标元素,就增加row的值表示排除最上一行,如果右上角元素等于目标元素就是返回true,否则循环结束后返回false。需要注意的是矩阵为空的情况。
代码
我的代码
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty())
return false;
if (matrix[0].empty())
return false;
int row = 0, col = matrix[0].size() - 1;
while(row < matrix.size() && col > -1) {
int right = matrix[row][col];
if (right == target)
return true;
else if (right < target)
row++;
else
col--;
}
return false;
}
};
总结
这道题是使用分治算法,解题关键是想出来用右上角的元素进行比较来逐步减少问题的规模。
这是本周第一道题目,周四的时候会再刷一道题,尽量找关于最短路径的题目,找不到就随便挑一道完成,抓紧时间,努力加油~~