这周课上又双叒叕一次学习了分治算法
实话说每次讲这个都会被里面的递归算法怼到精神失常
下面是某天的产物:
题目地址:https://leetcode.com/problems/search-a-2d-matrix-ii/?tab=Description
题目:Search a 2D Matrix II
分类:Divide & Conquer
题目内容:
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
请大家编写出一个高效的算法来查找一个m * n的矩阵中每个项的取值,这个矩阵有着下面几种性质:
- Integers in each row are sorted in ascending from left to right.
- Integers in each column are sorted in ascending from top to bottom.
- 每一排及列的全部项都是按照从左到右,从上到下的升序排列的
For example,
Consider the following 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] ]
Given target = 5
, return true
.
Given target = 20
, return false
.
分析:
这是一道非常迷的题
看完了题,如果不是因为它隶属于分治的分类
可能我会直接写个循环进行逐个查找= =
然而。。。
好的,当我们回归递归的思路之中
会发现如果是要对矩阵之中的项进行查找的话
我们是能够找到某种共性的
于是递归的解法就这样了:
class Solution {
public:
bool search(vector<vector<int>>& matrix, int tar, int row, int cum, int c){
if(row == 0 && matrix[row][cum] < tar)return false;
else if(matrix[row][cum] == tar)return true;
else if(matrix[row][cum] > tar)
return search(matrix, tar, row, cum - 1, c);
else if(matrix[row][cum] < tar)
return search(matrix, tar, row - 1, c - 1, c);
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int r = matrix.size();
if(r == 0)return false;
int c = matrix[0].size();
if(c == 0)return false;
if(matrix[0][0] <= target){
for(int i = 0; i < r; i++){
if(i == r - 1){
if(matrix[i][c - 1] >= target)
return search(matrix, target, i, c - 1, c);
break;
}
if(matrix[i][c - 1] >= target && matrix[i + 1][0] >= target){
if(matrix[i + 1][0] == target)return true;
return search(matrix, target, i, c - 1, c);
}
}
}
return false;
}
};
可以看到在刚开始判断是否递归的时候我傻傻地写了很多很多的if
看了dalao们的代码才发现这些是能够被简化的
希望下次能够写出更简洁的代码(ˇˍˇ)