这道题目让我觉得算法,特别是google的算法是真的难。
难于上青天。
给了一个二维数组,求最长增长子序列。
初看这个问题数组是无序的,最长子序列是有序。但是是目标,和如何解决这个问题没有啥关系。
既然觉得没有关系,那么就创造关系。
排序,绑定坐标后按照数值排序。
for(int i = 0; i<row; i++){
for(int j = 0; j<col; j++) {
myvector.push_back({matrix[i][j], make_pair(i, j)});
}
}
sort(myvector.begin(), myvector.end());
这样就得到了有序序列了。
数从小到大。
这样就能分别从小到大计算每个dp的数值了。
dp推导公式为:
dp[x][y] = max(dp[x][y], dp[newX][newY] + 1);
代码如下:
class Solution {
public:
int longestIncreasingPath(vector<vector<int>>& matrix) {
//300 题的变种。就和一般的面试一样。下个题目是上个题目的变种。
//先排序, 按照数值排序,并绑定坐标。
vector<pair<int , pair<int, int>>> myvector;
int row = matrix.size();
int col = matrix[0].size();
vector<int> dirX{1, 0, -1, 0};
vector<int> dirY{0, -1, 0, 1};
for(int i = 0; i<row; i++){
for(int j = 0; j<col; j++) {
myvector.push_back({matrix[i][j], make_pair(i, j)});
}
}
sort(myvector.begin(), myvector.end());
vector<vector<int>> dp(row, vector<int>(col, 1));
for(auto it = myvector.begin(); it != myvector.end(); it++){
int val = it->first;
pair<int, int> coordinate = it->second;
int x = coordinate.first;
int y = coordinate.second;
if(it == myvector.begin()){
dp[x][y] = 1;
continue;
}
for(int i = 0;i<4;i++) {
int newX = x + dirX[i];
int newY = y + dirY[i];
if(newX < 0 || newX >= row || newY < 0 || newY >= col)
continue;
if(matrix[x][y] > matrix[newX][newY])
dp[x][y] = max(dp[x][y], dp[newX][newY] + 1);
}
}
int ret = 1;
for(int i = 0;i< row;i++){
for(int j = 0; j< col;j++){
ret = max(ret, dp[i][j]);
}
}
return ret;
}
};
1162. As Far from Land as Possible 刷到1162题目的时候,觉得可以用同样的办法做。
根据这个思想,做到最后发现傻了。
首先排序后得到的系列只有陆地和海洋,根本没有办法像这道题一样做。
只能用bfs,一层层的去做。