题目:329. 矩阵中的最长递增路径 - 力扣(LeetCode)
数据规模很小,排序就够了
cpp
struct Node {
int x;
int y;
int val;
Node* up = nullptr;
Node* down = nullptr;
Node* left = nullptr;
Node* right = nullptr;
int length = 0;
Node(int _x, int _y, int _v) {
x = _x;
y = _y;
val = _v;
}
};
bool myComp(Node* a, Node* b) {
return a->val < b->val;
}
class Solution {
public:
int longestIncreasingPath(vector<vector<int>>& matrix) {
vector<Node*> arr;
int upIdx, leftIdx;
for (int i = 0; i < matrix.size(); i++) {
vector<int>& t = matrix[i];
for (int j = 0; j < t.size(); j++) {
Node* node = new Node(i, j, t[j]);
arr.push_back(node);
if (i > 0) {
upIdx = (i - 1) * t.size() + j;
node->up = arr[upIdx];
arr[upIdx]->down = node;
}
if (j > 0) {
leftIdx = i * t.size() + j - 1;
node->left = arr[leftIdx];
arr[leftIdx]->right = node;
}
}
}
sort(arr.begin(), arr.end(), myComp);
int max;
int ret = 1;
for (int i = 0; i < arr.size(); i++) {
Node* node = arr[i];
max = 0;
if (node->left && node->left->val < node->val && node->left->length > max) {
max = node->left->length;
}
if (node->right && node->right->val < node->val && node->right->length > max) {
max = node->right->length;
}
if (node->up && node->up->val < node->val && node->up->length > max) {
max = node->up->length;
}
if (node->down && node->down->val < node->val && node->down->length > max) {
max = node->down->length;
}
node->length = max + 1;
if (node->length > ret) {
ret = node->length;
}
}
return ret;
}
};