LeetCode #329: Longest Increasing Path in a Matrix

来源:互联网 发布:网络结构拓扑图 编辑:程序博客网 时间:2024/05/16 08:07

Problem Statement

(Source) Given an integer matrix, find the length of the longest increasing path.

From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed).

Example 1:

nums = [  [9,9,4],  [6,6,8],  [2,1,1]]

Return 4
The longest increasing path is [1, 2, 6, 9].

Example 2:

nums = [  [3,4,5],  [3,2,6],  [2,2,1]]

Return 4
The longest increasing path is [3, 4, 5, 6]. Moving diagonally is not allowed.

Analysis

This is an Dynamic Programming and Depth-first Search problem. The idea is to reconstruct the matrix first. Then use an dp “array” length: @type list to compute and save solution of sub-problems, to achieve the global optimal solution at last.

Solution

Bottom-up DP:

class Solution(object):    def longestIncreasingPath(self, matrix):        """        :type matrix: List[List[int]]        :rtype: int        """        mat = {i + j * 1j : v for i, row in enumerate(matrix) for j, v in enumerate(row)}        length = {}        for z in sorted(mat, key=mat.get):            length[z] = 1 + max([length[Z] for Z in z + 1, z - 1, z + 1j, z - 1j if Z in mat and mat[z] > mat[Z]] or [0])        return max(length.values() or [0])     
0 0
原创粉丝点击