leetcode刷题,碰到了这样一道阿里实习笔试题,记录一下我的解题思路
题目介绍
大概意思就是给定一个mXn的矩阵,矩阵里面都是非负整数,那么现在要从蓝色区域出发(矩阵上边的矩阵外的区域),要到达红色区域,请问这个过程中的路径和最小是多少?
你可以从第一行任意一个起点出发,行走的时候可以 往下走,往左走,往右走。求最小的路径和。
(忘了加个条件,矩阵里都是非负数)需要遍历,
我的解答
纪录每一次遍历得到的和,之后的遍历,如果超过了之前的和,就跳出,如果小于,就重新记录。很快就可以得出结论了。实际写了一下,发现还是获取所有的路线比较难,遍历反而很简单。这是我的代码:
import sys
import time
sys.setrecursionlimit(9000000) # 这里设置大一些
def list_list_get_min(list_0):
end_list = get_step_list(list_0)
print(end_list)
sum_result = 0
for func_x in end_list:
sum_x = 0
for index in func_x:
sum_x += list_0[index[1]][index[0]]
if sum_result == 0:
print(func_x)
print(sum_x)
sum_result = sum_x
if sum_x < sum_result:
print(func_x)
print(sum_x)
sum_result = sum_x
print(sum_result)
return 0
def get_step_list(list_0, going_list=[], end_list=[]):
# time.sleep(1)
print('-'*30)
print(going_list, end_list)
if not list_0:
return []
# 如果还没开始
if not going_list and not end_list:
# 获取所有的起点坐标
for i in range(len(list_0[0])):
going_list.append([(i, 0)])
return get_step_list(list_0, going_list, end_list)
# 都走完了,返回结果
if not going_list:
return end_list
# 如果已经开始,则递归获取所有的策略
x0, y0 = going_list[0][-1]
# 已经走完的,放进end_list
if y0 == len(list_0) - 1:
end_list.append(going_list[0])
going_list = going_list[1::]
return get_step_list(list_0, going_list, end_list)
# 没走完的,获取下一步
next_step = get_next_index(list_0, x0, y0)
next_step = [i for i in next_step if i not in going_list[0]]
# 把新生成的策略放进去
for step in next_step:
going_list.append([*going_list[0], step])
# 上一步策略取出来
going_list = going_list[1::]
# 继续递归
return get_step_list(list_0, going_list, end_list)
def get_next_index(list_0, x0, y0):
next_step = []
# 第一步只能前进
if y0 == 0 and len(list_0) > 1:
return [(x0, y0 + 1)]
if x0 > 0:
next_step.append((x0 - 1, y0))
pass
if x0 + 1 < len(list_0[0]):
next_step.append((x0 + 1, y0))
next_step.append((x0, y0 + 1))
return next_step
a = [
[7, 5, 1, 3],
[1, 1, 1, 9],
[1, 10, 3, 7],
[1, 1, 1, 4],
[2, 100, 1, 4]
]
# a = [
# [10,2,1],
# [10,2,100],
# [1,2,1]
# ]
# next_step_list = get_next_index(a, 1, 2)
# print(next_step_list)
aaa = list_list_get_min(a)