329. Longest Increasing Path in a Matrix

这道题目让我觉得算法,特别是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,一层层的去做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值