No_64最小路径和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

题解:题目中说明每次只能向下或者向右移动,每次循环更改grid[i][j]位置最小的路径,grid[i][j]最小路径值为grid[i-1][j]+grid[i][j-1]

public class No_64 {
    public int minPathSum(int[][] grid) {
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
                if(i==0&&j==0)
                    continue;
                else if(i==0){
                    grid[i][j]=grid[i][j-1]+grid[i][j];
                }else if(j==0){
                    grid[i][j]=grid[i-1][j]+grid[i][j];
                }else {
                    grid[i][j]=Math.min(grid[i-1][j],grid[i][j-1])+grid[i][j];
                }

            }
        }
        return grid[grid.length-1][grid[0].length-1];


    }
}
你可以使用深度优先搜索(DFS)算法来进行深度遍历并找到最小路径。下面是一个使用Java实现DFS的示例代码,其中包括寻找最小路径的部分: ```java import java.util.ArrayList; import java.util.List; public class MinimumPathDFS { private int minPath; // 最小路径长度 private List<Integer> minPathNodes; // 最小路径节点列表 public List<Integer> findMinimumPath(int[][] graph, int start, int end) { minPath = Integer.MAX_VALUE; minPathNodes = new ArrayList<>(); List<Integer> path = new ArrayList<>(); boolean[] visited = new boolean[graph.length]; dfs(graph, start, end, 0, path, visited); return minPathNodes; } private void dfs(int[][] graph, int current, int end, int pathLen, List<Integer> path, boolean[] visited) { path.add(current); visited[current] = true; if (current == end) { if (pathLen < minPath) { minPath = pathLen; minPathNodes.clear(); minPathNodes.addAll(path); } } else { for (int i = 0; i < graph[current].length; i++) { if (graph[current][i] != 0 && !visited[i]) { dfs(graph, i, end, pathLen + graph[current][i], path, visited); } } } path.remove(path.size() - 1); visited[current] = false; } public static void main(String[] args) { int[][] graph = { {0, 2, 4, 0, 0}, {0, 0, 3, 2, 0}, {0, 0, 0, 0, 2}, {0, 0, 0, 0, 3}, {0, 0, 0, 0, 0} }; int start = 0; int end = 4; MinimumPathDFS solver = new MinimumPathDFS(); List<Integer> minPathNodes = solver.findMinimumPath(graph, start, end); if (minPathNodes.isEmpty()) { System.out.println("No path found!"); } else { System.out.println("Minimum path: " + minPathNodes); System.out.println("Minimum path length: " + (solver.minPath - graph[start][end])); } } } ``` 在上面的示例中,我们通过传入一个邻接矩阵 `graph`、起始节点 `start` 和目标节点 `end` 来调用 `findMinimumPath` 方法,它会返回最小路径上的节点列表。 请注意,这只是一个简单的示例,假设节点之间的路径长度都是非负整数。如果图中存在负权边,则需要使用其他算法,如Dijkstra算法或Bellman-Ford算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值