注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
本帖最后由 ygmm 于 2019-8-23 15:13 编辑
请问这道题是不是不可以用Dijkstra 算法做? 或者能用,但是我的代码错了?
我弄了很久都没找出来问题所在
- class Solution {
- public int minPathSum(int[][] grid) {
- int m = grid.length;
- int n = grid[0].length;
- int V = m * n; // total count of nodes
- int[][] directions = {{1, 0},{-1, 0},{0, -1},{0, 1}};
-
- boolean[] settled = new boolean[V];
- int[] distance = new int[V];
- for(int i = 0; i < V; i++){
- distance[i] = Integer.MAX_VALUE;
- settled[i] = false;
- }
- distance[0] = grid[0][0]; // set starting node
-
- for(int vcount = 0; vcount < V; vcount++){
- int index = findmin(distance, settled);
- settled[index] = true;
-
- int i = index / n;
- int j = index % n;
- for(int[] direction : directions){
- int newi = i + direction[0];
- int newj = j + direction[1];
- if(newi < 0 || newj < 0 || newi >= m|| newj >= n){
- continue;
- }
- int toindex = newi * n + newj;
- if(settled[toindex] == false && distance[index] + grid[newi][newj] < distance[toindex]){
- distance[toindex] = distance[index] + grid[newi][newj];
- }
- }
- }
- return distance[V-1];
- }[/i][/i]
- [i][i]// find node having current minimum path from(0,0)
- private int findmin(int[] distance, boolean[] settled){
- int min = Integer.MAX_VALUE;
- int index = -1;
- for(int i = 0; i < distance.length; i++){
- if(settled[i] == false && distance[i] < min){
- min = distance[i];
- index = i;
- }
- }
- return index;
- }
- }
复制代码
很多测试用例都能通过,但是有几个不行,结果有出入。 不知道为什么。
测试用例
{{5,4,2,9,6,0,3,5,1,4,9,8,4,9,7,5,1},
{3,4,9,2,9,9,0,9,7,9,4,7,8,4,4,5,8},
{6,1,8,9,8,0,3,7,0,9,8,7,4,9,2,0,1},
{4,0,0,5,1,7,4,7,6,4,1,0,1,0,6,2,8},
{7,2,0,2,9,3,4,7,0,8,9,5,9,0,1,1,0},
{8,2,9,4,9,7,9,3,7,0,3,6,5,3,5,9,6},
{8,9,9,2,6,1,2,5,8,3,7,0,4,9,8,8,8},
{5,8,5,4,1,5,6,6,3,3,1,8,3,9,6,4,8}}
代码算下来是72, 正确是73.
请有兴趣用脑子debug的朋友帮忙看看。。。。我看了很久也没看出来,用debug去跟踪,太长了,实在难以坚持。 这是严格按照Dijkstra算法写的啊。。。也没有负数。。。
[/i][/i][/i][/i][/i]
|