64. Minimum Path Sum

本文探讨了如何使用动态规划解决最小路径和问题,即在一个m x n网格中,从左上角到右下角的路径中求和最小的路径。通过逐行逐列累加最小值,实现O(mn)的时间复杂度和O(1)的空间复杂度。

题目:

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

 

Hide Tags
  Array Dynamic Programming
 

链接: http://leetcode.com/problems/minimum-path-sum/

题解:

DP,可以in-place,也可以使用滚动数组。

Time Complexity - O(mn), Space Complexity - O(1)。

public class Solution {
    public int minPathSum(int[][] grid) {
        if(grid == null || grid.length == 0)
            return 0;
            
        for(int i = 1; i < grid.length; i ++){
            grid[i][0] += grid[i - 1][0]; 
        }
        
        for(int j = 1; j < grid[0].length; j ++){
            grid[0][j] += grid[0][j - 1];
        }
        
        for(int i = 1; i < grid.length; i ++){
            for(int j = 1; j < grid[0].length; j ++){
                grid[i][j] += Math.min(grid[i][j - 1], grid[i - 1][j]);
            }
        }
        
        return grid[grid.length - 1][grid[0].length - 1];
    }
}

 

Update:

public class Solution {
    public int minPathSum(int[][] grid) {
        if(grid == null || grid.length == 0)
            return 0;
        int rowLen = grid.length, colLen = grid[0].length;
        
        for(int i = 1; i < rowLen; i++)     //initialize first column
            grid[i][0] += grid[i - 1][0];
        
        for(int j = 1; j < colLen; j++)     //initialize first row
            grid[0][j] += grid[0][j - 1];
        
        int sum = 0;
        
        for(int i = 1; i < rowLen; i++) {
            for(int j = 1; j < colLen; j++) {
                grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
            }
        }
        
        return grid[rowLen - 1][colLen - 1];
    }
}

 

二刷:

依然是dp,跟前两道题一样。

Java:

Time Complexity - O(mn), Space Complexity - O(1)。

public class Solution {
    public int minPathSum(int[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }
        int rowNum = grid.length, colNum = grid[0].length;
        for (int i = 1; i < rowNum; i++) {
            grid[i][0] += grid[i - 1][0];
        }
        for (int j = 1; j < colNum; j++) {
            grid[0][j] += grid[0][j - 1];
        }
        for (int i = 1; i < rowNum; i++) {
            for (int j = 1; j < colNum; j++) {
                grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
            }
        }
        return grid[rowNum - 1][colNum - 1];
    }
}

 

题外话:

1/31/2016

这几天头有点昏,做题速度较慢。其实这一个月都很慢,按照计划应该完成了150题才对,结果到现在为止也才60题,差得太多了。

现在是8点,我在犹豫要不要去吃半亩园。9点钟关门, 开车过去大概20分钟的样子。下午刚跑完步,晚上来一顿估计就白跑了 -____-!! 纠结啊

 

三刷:

Java:

Time Complexity - O(mn), Space Complexity - O(n)。     m为行数,n为列数

public class Solution {
    public int minPathSum(int[][] grid) {
        if (grid == null || grid.length == 0) return Integer.MIN_VALUE;
        int rowNum = grid.length, colNum = grid[0].length;
        for (int i = 1; i < rowNum; i++) grid[i][0] += grid[i - 1][0];
        for (int j = 1; j < colNum; j++) grid[0][j] += grid[0][j - 1];
        
        for (int i = 1; i < rowNum; i++) {
            for (int j = 1; j < colNum; j++) {
                grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
            }
        }
        return grid[rowNum - 1][colNum - 1];
    }
}

 

Update:

使用滚动数组。

Java:

public class Solution {
    public int minPathSum(int[][] grid) {
        if (grid == null || grid.length == 0) return 0;
        int rowNum = grid.length, colNum = grid[0].length;
        int[] dp = new int[colNum];
        dp[0] = grid[0][0];
        for (int j = 1; j < colNum; j++) dp[j] = grid[0][j] + dp[j - 1];
        
        for (int i = 1; i < rowNum; i++) {
            dp[0] += grid[i][0];
            for (int j = 1; j < colNum; j++) {
                dp[j] = grid[i][j] + Math.min(dp[j], dp[j - 1]);
            }
        }
        
        return dp[colNum - 1];
    }
}

 

 

<think>好的,我现在需要解决用户在使用ArcGIS的Python 2.7.14脚本时遇到的运行时错误。用户的问题出现在计算相关系数后,打印统计摘要时,Describe对象没有minimum和maximum属性,导致AttributeError。 首先,我应该回忆一下arcpy.Describe函数的功能。Describe通常用于获取数据集的属性,比如栅格数据的格式、范围等,但可能不直接提供统计值如最小值和最大值。用户代码中使用arcpy.Describe(r.save(...))后的描述对象来获取min和max,这可能不正确,因为Describe可能不包含这些统计信息。 接下来,正确的做法应该是使用Raster对象的getRasterInfo()方法,或者使用arcpy.GetRasterProperties_management工具来获取统计信息。比如,用户可能需要调用arcpy.CalculateStatistics_management先计算统计值,再通过GetRasterProperties获取具体的min和max。 另外,用户代码中保存栅格后,可能需要先计算统计信息,否则统计值可能不存在。原代码中可能在保存后立即尝试获取统计值,但此时统计信息尚未生成,导致错误。因此,应该在保存栅格后调用CalculateStatistics,然后再用GetRasterProperties来获取最小和最大值。 同时,用户的环境可能存在栅格统计信息未自动计算的情况,尤其是在脚本中生成新栅格后。所以显式地计算统计信息是必要的步骤。 另外,检查用户代码中的路径是否正确,确保输出栅格已经正确保存,并且有权限访问。不过根据错误信息,问题更可能出在获取统计的方式上,而不是路径问题。 最后,修改代码的步骤应该是:在保存栅格后,使用arcpy.CalculateStatistics_management,然后使用arcpy.GetRasterProperties_management分别获取min和max属性,并确保使用正确的语法,如将路径传递给这些函数。 总结修改步骤为:替换Describe为GetRasterProperties,并添加CalculateStatistics确保统计信息存在。同时,处理可能的异常或路径问题,确保代码兼容Python 2.7和ArcMap的环境。</think>=== 修正后的代码 === ```python # 计算相关系数(保持原有计算逻辑) cov_sum = Raster(os.path.join(output_gdb, "cov_sum")) k_std = Raster(os.path.join(output_gdb, "k_std")) t_std = Raster(os.path.join(output_gdb, "t_std")) r = cov_sum / (23 * k_std * t_std) r = Con(r < -1, -1, Con(r > 1, 1, r)) # 强制限制值域[-1,1] r.save(os.path.join(output_gdb, "k_t_correlation")) # === 关键修改:使用栅格属性获取方法 === # 先强制计算统计值(避免统计信息未生成) arcpy.CalculateStatistics_management( in_raster=os.path.join(output_gdb, "k_t_correlation"), skip_existing=False # 强制重新计算 ) # 获取最小值最大值(正确方法) r_min = arcpy.GetRasterProperties_management( in_raster=os.path.join(output_gdb, "k_t_correlation"), property_type="MINIMUM" ).getOutput(0) r_max = arcpy.GetRasterProperties_management( in_raster=os.path.join(output_gdb, "k_t_correlation"), property_type="MAXIMUM" ).getOutput(0) # 打印结果(保留两位小数) safe_print(u"相关系数计算完成!值范围:{:.2f} ~ {:.2f}".format(float(r_min), float(r_max))) ``` === 错误原因解析 === 1. **Describe对象无统计属性**:`arcpy.Describe()` 返回的元数据对象不直接包含栅格统计值(如最小值/最大值),它主要用于描述数据格式、坐标系等基础属性 2. **正确的统计获取方式**: - 先用 `CalculateStatistics` 生成统计信息 - 再通过 `GetRasterProperties` 提取具体属性 3. **强制类型转换**:`GetRasterProperties` 返回的是字符串类型,需转换为 `float` 才能格式化输出 === 操作建议 === 1. 确保输出文件夹 (`output_gdb`) 有写入权限 2. 如果栅格数据量较大,可在 `CalculateStatistics` 中添加 `x_skip_factor` 和 `y_skip_factor` 参数加速计算(例如设置为10) 3. 在 ArcMap 的 Python 窗口中运行时,建议先执行 `arcpy.CheckOutExtension("Spatial")` 激活 Spatial Analyst 扩展 **验证方法**:在 ArcMap 中手动右键点击生成的 `k_t_correlation` 栅格 → 属性 → 源选项卡,查看统计值是否脚本输出一致。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值