美文网首页
【算法题】2662. 前往目标的最小代价

【算法题】2662. 前往目标的最小代价

作者: 程序员小2 | 来源:发表于2023-05-04 08:02 被阅读0次

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
坚持不懈,越努力越幸运,大家一起学习鸭~~~

题目:

给你一个数组 start ,其中 start = [startX, startY] 表示你的初始位置位于二维空间上的 (startX, startY) 。另给你一个数组 target ,其中 target = [targetX, targetY] 表示你的目标位置 (targetX, targetY) 。

从位置 (x1, y1) 到空间中任一其他位置 (x2, y2) 的代价是 |x2 - x1| + |y2 - y1| 。

给你一个二维数组 specialRoads ,表示空间中存在的一些特殊路径。其中 specialRoads[i] = [x1i, y1i, x2i, y2i, costi] 表示第 i 条特殊路径可以从 (x1i, y1i) 到 (x2i, y2i) ,但成本等于 costi 。你可以使用每条特殊路径任意次数。

返回从 (startX, startY) 到 (targetX, targetY) 所需的最小代价。

示例 1:

输入:start = [1,1], target = [4,5], specialRoads = [[1,2,3,3,2],[3,4,4,5,1]]
输出:5
解释:从 (1,1) 到 (4,5) 的最优路径如下:

  • (1,1) -> (1,2) ,移动的代价是 |1 - 1| + |2 - 1| = 1 。
  • (1,2) -> (3,3) ,移动使用第一条特殊路径,代价是 2 。
  • (3,3) -> (3,4) ,移动的代价是 |3 - 3| + |4 - 3| = 1.
  • (3,4) -> (4,5) ,移动使用第二条特殊路径,代价是 1 。
    总代价是 1 + 2 + 1 + 1 = 5 。
    可以证明无法以小于 5 的代价完成从 (1,1) 到 (4,5) 。
    示例 2:

输入:start = [3,2], target = [5,7], specialRoads = [[3,2,3,4,4],[3,3,5,5,5],[3,4,5,6,6]]
输出:7
解释:最优路径是不使用任何特殊路径,直接以 |5 - 3| + |7 - 2| = 7 的代价从初始位置到达目标位置。

提示:

start.length == target.length == 2
1 <= startX <= targetX <= 10^5
1 <= startY <= targetY <= 10^5
1 <= specialRoads.length <= 200
specialRoads[i].length == 5
startX <= x1i, x2i <= targetX
startY <= y1i, y2i <= targetY
1 <= costi <= 10^5

java代码:

class Solution {
    public int minimumCost(int[] start, int[] target, int[][] specialRoads) {
        long t = (long) target[0] << 32 | target[1];
        var dis = new HashMap<Long, Integer>();
        dis.put(t, Integer.MAX_VALUE);
        dis.put((long) start[0] << 32 | start[1], 0);
        var vis = new HashSet<Long>();
        for (;;) {
            long v = -1;
            int dv = -1;
            for (var e : dis.entrySet())
                if (!vis.contains(e.getKey()) && (dv < 0 || e.getValue() < dv)) {
                    v = e.getKey();
                    dv = e.getValue();                
                }
            if (v == t) return dv; // 到终点的最短路已确定
            vis.add(v);
            int vx = (int) (v >> 32), vy = (int) (v & Integer.MAX_VALUE);
            // 更新到终点的最短路
            dis.merge(t, dv + target[0] - vx + target[1] - vy, Math::min);
            for (var r : specialRoads) {
                int d = dv + Math.abs(r[0] - vx) + Math.abs(r[1] - vy) + r[4];
                long w = (long) r[2] << 32 | r[3];
                if (d < dis.getOrDefault(w, Integer.MAX_VALUE))
                    dis.put(w, d);
            }
        }
    }
}

相关文章

  • 个人关于机器学习的周记之九

    这周我们将介绍梯度下降: 梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数的最小值。 梯...

  • Kruskal

    Kruskal算法此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入...

  • 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijks

    算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。 1.Kr...

  • Normal Equation(正规方程)

    在我们接触到梯度下降算法这一个算法时,求代价函数最小值时,通过求导来获得。因此对于代价函数的每个参数,我们分别对于...

  • bigger is greater

    heckerrank 算法题。 原题地址 此题大意为找到,字典序的下一个最小序列。 input output 通过...

  • 梯度下降算法 (Gradient Descent)

    已知了代价函数: 我们需要一个算法来最小化 ,而梯度下降算法可以解决这个问题。 梯度下降算法不仅可以应用于多种函数...

  • 算法101  三方登录: weibo  (error:r

    Code Review Swift 算法题: 最小面积矩形  Leetcode 的动人之处 题目描述: 939...

  • 1.2梯度下降算法

    梯度下降算法 梯度下降算法可将代价函数最小化。 在梯度下降算法在不停地一点点改变和,试图通过这种改变使得变小,直到...

  • 单变量线性回归(二)

    梯度下降(Gradient Descent) 我们将使用梯度下降算法来求出使得代价函数J(θ0, θ1)值最小的参...

  • 【Andrew Ng机器学习】单变量线性回归-梯度下降

    课程:吴恩达机器学习 此篇我们将学习梯度下降算法,我们之前已经定义了代价函数J,梯度下降法可以将代价函数J最小化。...

网友评论

      本文标题:【算法题】2662. 前往目标的最小代价

      本文链接:https://www.haomeiwen.com/subject/wmhxsdtx.html