2022-04-10:给定一个二维数组,其中全是非负数, 每一步都可以往上下左右四个方向运动。 返回从左上角走到右下角的最短距离。

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-04-10:给定一个二维数组,其中全是非负数, 每一步都可以往上下左右四个方向运动。 返回从左上角走到右下角的最短距离。相关的知识,希望对你有一定的参考价值。

2022-04-10:给定一个二维数组,其中全是非负数,
每一步都可以往上、下、左、右四个方向运动。
返回从左上角走到右下角的最短距离。

答案2022-04-10:

单元最短路径算法。堆。

代码用golang编写。代码如下:

package main

import (
	"fmt"
	"sort"
)

func main() 
	arr := [][]int
		1, 2, 3, 4,
		5, 6, 7, 8,
		9, 10, 11, 12,
		13, 14, 15, 16
	ret := bestWalk2(arr)
	fmt.Println(ret)


func bestWalk2(map0 [][]int) int 

	n := len(map0)
	m := len(map0[0])
	// 堆
	// 每一个对象,都是一个小数组
	// dis, row, col
	//  0    1    2
	heap0 := make([][]int, 0)
	// X,0,1 已经弹出了! 以后在遇到(0,1)的事情,不管!
	// poped记录哪些位置弹出,哪些没有!
	poped := make([][]bool, n)
	for i := 0; i < n; i++ 
		poped[i] = make([]bool, m)
	
	heap0 = append(heap0, []intmap0[0][0], 0, 0)
	ans := 0
	for len(heap0) > 0 
		sort.Slice(heap0, func(i, j int) bool 
			a := heap0[i]
			b := heap0[j]
			return a[0] < b[0]
		)
		cur := heap0[0]
		heap0 = heap0[1:]
		dis := cur[0]
		row := cur[1]
		col := cur[2]
		if poped[row][col] 
			continue
		
		// 接下来就是要处理这个位置了!
		poped[row][col] = true
		if row == n-1 && col == m-1 
			ans = dis
			break
		
		add(dis, row-1, col, n, m, map0, poped, &heap0)
		add(dis, row+1, col, n, m, map0, poped, &heap0)
		add(dis, row, col-1, n, m, map0, poped, &heap0)
		add(dis, row, col+1, n, m, map0, poped, &heap0)
	
	return ans


func add(pre, row, col, n, m int, map0 [][]int, used [][]bool, heap0 *[][]int) 
	if row >= 0 && row < n && col >= 0 && col < m && !used[row][col] 
		*heap0 = append(*heap0, []intpre + map0[row][col], row, col)
	


执行结果如下:


左神java代码

《新程序员》:云原生和全面数字化实践 50位技术专家共同创作,文字、视频、音频交互阅读

以上是关于2022-04-10:给定一个二维数组,其中全是非负数, 每一步都可以往上下左右四个方向运动。 返回从左上角走到右下角的最短距离。的主要内容,如果未能解决你的问题,请参考以下文章

给定 0 和 1 的二维数组,使用回溯找到其中的所有正方形

算法review

2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有01两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] == 1 表示(i,j)位置坐了人 根据防

2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有01两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] == 1 表示(i,j)位置坐了人 根据防

2022-08-24:给定一个长度为3N的数组,其中最多含有012三种值, 你可以把任何一个连续区间上的数组,全变成012中的一种, 目的是让012三种数字的个数都是N。 返回最小的变化次

二维数组 : 旋转矩阵