鱼C论坛

 找回密码
 立即注册
查看: 2909|回复: 23

[已解决]Python:每日一题 391

[复制链接]
发表于 2020-5-12 20:29:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 永恒的蓝色梦想 于 2020-5-13 16:09 编辑

今天的题目:


编写函数,输入一个矩阵(类型为 List[List[int]]),在只允许向右和向下移动的情况下,输出从左上角到右下角的最小路径和。
示例:

输入:
[
    [131,673,234,103,18],
    [201,96,342,965,150],
    [630,803,746,422,111],
    [537,699,497,121,956],
    [805,732,524,37,331]
]
输出:2427
解释:标红路径即为最短路径


欢迎大家一起答题!
最佳答案
2020-5-12 20:51:43
class Solution:
    def minPathSum(self, grid):
        m,n=len(grid),len(grid[0])
        for _ in range(1,n):grid[0][_]+=grid[0][_-1]  #第一行的路径和
        for _ in range(1,m):grid[_][0]+=grid[_-1][0]  #第一列的路径和

        for i in range(1,n):
            for j in range(1,m):
                grid[j][i]+=min(grid[j-1][i],grid[j][i-1])   #然后分别一列一列的求出最短路径和


        return grid[m-1][n-1]     #最后一个就是求出的最小路径和

if __name__ == "__main__":
      obj = Solution()
        
      s=[
         [131,673,234,103,18],
         [201,96,342,965,150],
         [630,803,746,422,111],
         [537,699,497,121,956],
         [805,732,524,37,331]
         ]
      print(obj.minPathSum(s))

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
zltzlt + 3 + 3 + 3

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-12 20:31:23 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-5-13 16:03 编辑

二楼

参考答案:(结贴后放出)
def shortestWay(matrix):
    for i in range(len(matrix)):
        for j in range(len(matrix[0])):
            if i and j:
                matrix[i][j]+=min(matrix[i-1][j],matrix[i][j-1])
            elif i:
                matrix[i][j]+=matrix[i-1][j]
            elif j:
                matrix[i][j]+=matrix[i][j-1]

    return matrix[-1][-1]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 20:39:45 | 显示全部楼层
嗯,你应该设置个只允许作者查看的选项,不然别人解答就都漏出去所有人都能看到了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-12 20:44:08 | 显示全部楼层
heidern0612 发表于 2020-5-12 20:39
嗯,你应该设置个只允许作者查看的选项,不然别人解答就都漏出去所有人都能看到了。

OK
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 20:51:43 | 显示全部楼层    本楼为最佳答案   
class Solution:
    def minPathSum(self, grid):
        m,n=len(grid),len(grid[0])
        for _ in range(1,n):grid[0][_]+=grid[0][_-1]  #第一行的路径和
        for _ in range(1,m):grid[_][0]+=grid[_-1][0]  #第一列的路径和

        for i in range(1,n):
            for j in range(1,m):
                grid[j][i]+=min(grid[j-1][i],grid[j][i-1])   #然后分别一列一列的求出最短路径和


        return grid[m-1][n-1]     #最后一个就是求出的最小路径和

if __name__ == "__main__":
      obj = Solution()
        
      s=[
         [131,673,234,103,18],
         [201,96,342,965,150],
         [630,803,746,422,111],
         [537,699,497,121,956],
         [805,732,524,37,331]
         ]
      print(obj.minPathSum(s))

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 21:28:53 | 显示全部楼层
def daily391(grid: list) -> int:
    if not grid:
        return 0
    row, column = len(grid), len(grid[0])
    dp = [[0] * column for _ in range(row)]
    dp[0][0] = grid[0][0]
    for i in range(1, column):
        dp[0][i] = grid[0][i] + dp[0][i - 1]
    for i in range(1, row):
        dp[i][0] = grid[i][0] + dp[i - 1][0]
        for j in range(1, column):
            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
    pprint(dp)
    return dp[-1][-1]

感觉是不是可以用一维列表就足够了

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 21:30:23 | 显示全部楼层
def shortest_path(matrix):
    dp = [];
    for i in range(0, len(matrix)):
        line = [];
        for j in range(0,len(matrix[i])):
            line.append(0);
        dp.append(line);
    dp[0][0] = matrix[0][0];
    for i in range(1, len(matrix[0])):
        dp[0][i] = dp[0][i-1] + matrix[0][i]
    for i in range(1,len(matrix)):
        dp[i][0] = dp[i-1][0] + matrix[i][0]
    for i in range(1, len(matrix)):
        for j in range(1, len(matrix[i])):
            if dp[i][j-1] < dp[i-1][j]:
                dp[i][j] = dp[i][j-1] + matrix[i][j];
            else:
                dp[i][j] = dp[i-1][j] + matrix[i][j];
    return dp[len(matrix)-1][len(matrix[0])-1];

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 21:30:55 From FishC Mobile | 显示全部楼层
本帖最后由 kinkon 于 2020-5-12 22:49 编辑

动态规则
def f391(List):
    if not List or not List[0]:
        return 0
    m, n = len(List), len(List[0])
    for i in range(m):
        for j in range(n):
            if i == 0 and j == 0:
                continue
            elif i == 0 and j > 0:
                List[i][j] += List[i][j-1]
            elif i > 0 and j == 0:
                List[i][j] += List[i-1][j]
            else:
                List[i][j] += min(List[i-1][j], List[i][j-1])                                         
    #print(List)
    return List[-1][-1]

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 21:44:53 | 显示全部楼层
def daily391_0(grid: list) -> int:
    if not grid:
        return 0
    row, column = len(grid), len(grid[0])
    steps = [sum(grid[0][:i]) for i in range(1, column + 1)]
    for i in range(1, row):
        steps[0] += grid[i][0]
        for j in range(1, column):
            steps[j] = min(steps[j - 1], steps[j]) + grid[i][j]
    return steps[-1]

用一维列表保存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 21:57:42 | 显示全部楼层
def f391(M):
    for i in range(len(M)):
        for j in range(len(M[0])):
            if i and j:
                M[i][j]+=min(M[i-1][j],M[i][j-1])
            elif i:
                M[i][j]+=M[i-1][j]
            elif j:
                M[i][j]+=M[i][j-1]
    return M[-1][-1]

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 22:42:51 | 显示全部楼层
这种题涉及的是算法么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 10:57:57 | 显示全部楼层
本帖最后由 liuzhengyuan 于 2020-5-13 11:02 编辑

这道题能用贪心解吗?

我打算用动态规划……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 14:20:04 | 显示全部楼层
def f(list1):
    list2 = []
    for index in range(0,len(list1)):
        list2.append([0 for i in range(0,len(list1[0]))])
    list2[0][0] = list1[0][0]
    for n in range(1,len(list2[0])):
        list2[0][n] = list2[0][n-1] + list1[0][n]
    for n in range(1,len(list2)):
        list2[n][0] = list2[n-1][0] + list1[n][0]
    for m in range(1,len(list1)):
        for n in range(1,len(list1[0])):
            list2[m][n] = min(list2[m-1][n],list2[m][n-1]) + list1[m][n]
    return list2[-1][-1]
好像做过这个题目

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 14:30:24 | 显示全部楼层
有答案吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 16:34:07 From FishC Mobile | 显示全部楼层
rsj0315 发表于 2020-5-12 22:42
这种题涉及的是算法么?

矩阵操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 16:35:01 From FishC Mobile | 显示全部楼层
这涉及到了我不太擅长的方面(矩阵)
在 leetcode 会含泪跳过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-13 16:38:57 | 显示全部楼层
_2_ 发表于 2020-5-13 16:35
这涉及到了我不太擅长的方面(矩阵)
在 leetcode 会含泪跳过

其实就是二维数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 16:40:34 From FishC Mobile | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-13 16:38
其实就是二维数组


……
A LeetCode a day keeps confidence away.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 17:19:10 | 显示全部楼层
def f391(ls):
    for i in range(len(ls)):
        for j in range(len(ls[0])):
            if i!=0 and j==0:
                ls[i][j]+=ls[i-1][j]
            if j!=0 and i==0:
                ls[i][j]+=ls[i][j-1]
            if i!=0 and j!=0:
                ls[i][j]+=min(ls[i-1][j],ls[i][j-1])             
    return ls[-1][-1]

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-30 10:50:03 | 显示全部楼层

评分

参与人数 1荣誉 -2 鱼币 -2 收起 理由
qiuyouzhi -2 -2 请不要无意义灌水!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 05:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表