0%

    2699. 修改图中的边权


    给你一个 n 个节点的 无向带权连通 图,节点编号为 0 到 n - 1 ,再给你一个整数数组 edges ,其中 edges[i] = [ai, bi, wi] 表示节点 ai 和 bi 之间有一条边权为 wi 的边。

    部分边的边权为 -1wi = -1),其他边的边权都为  数(wi > 0)。

    你需要将所有边权为 -1 的边都修改为范围 [1, 2 * 10^9] 中的 正整数 ,使得从节点 source 到节点 destination 的 最短距离 为整数 target 。如果有 多种 修改方案可以使 source 和 destination 之间的最短距离等于 target ,你可以返回任意一种方案。

    如果存在使 source 到 destination 最短距离为 target 的方案,请你按任意顺序返回包含所有边的数组(包括未修改边权的边)。如果不存在这样的方案,请你返回一个 空数组 。

    注意:你不能修改一开始边权为正数的边。

    示例 1:

    ```txt

    输入:n = 5, edges = [[4,1,-1],[2,0,-1],[0,3,-1],[4,3,-1]], source = 0, destination = 1, target = 5

    输出:[[4,1,1],[2,0,1],[0,3,3],[4,3,1]]

    解释:上图展示了一个满足题意的修改方案,从 0 到 1 的最短距离为 5 。

    ```

    示例 2:

    ```txt

    输入:n = 3, edges = [[0,1,-1],[0,2,5]], source = 0, destination = 2, target = 6

    输出:[]

    解释:上图是一开始的图。没有办法通过修改边权为 -1 的边,使得 0 到 2 的最短距离等于 6 ,所以返回一个空数组。

    ```

    示例 3:

    ```txt

    输入:n = 4, edges = [[1,0,4],[1,2,3],[2,3,5],[0,3,-1]], source = 0, destination = 2, target = 6

    输出:[[1,0,4],[1,2,3],[2,3,5],[0,3,1]]

    解释:上图展示了一个满足题意的修改方案,从 0 到 2 的最短距离为 6 。

    ```

    提示:

    • 1 <= n <= 100

    • 1 <= edges.length <= n * (n - 1) / 2

    • edges[i].length == 3

    • 0 <= ai, bi < n

    • wi = -1 或者 1 <= wi <= 10^7

    • ai != bi

    • 0 <= source, destination < n

    • source != destination

    • 1 <= target <= 10^9

    • 输入的图是连通图,且没有自环和重边。

阅读全文 »

    2290. 到达角落需要移除障碍物的最小数目


    给你一个下标从 0 开始的二维整数数组 grid ,数组大小为 m x n 。每个单元格都是两个值之一:

    • 0 表示一个 单元格,

    • 1 表示一个可以移除的 障碍物

    你可以向上、下、左、右移动,从一个空单元格移动到另一个空单元格。

    现在你需要从左上角 (0, 0) 移动到右下角 (m - 1, n - 1) ,返回需要移除的障碍物的 最小 数目。

    示例 1:

    ```txt

    输入:grid = [[0,1,1],[1,1,0],[1,1,0]]

    输出:2

    解释:可以移除位于 (0, 1) 和 (0, 2) 的障碍物来创建从 (0, 0) 到 (2, 2) 的路径。

    可以证明我们至少需要移除两个障碍物,所以返回 2 。

    注意,可能存在其他方式来移除 2 个障碍物,创建出可行的路径。

    ```

    示例 2:

    ```txt

    输入:grid = [[0,1,0,0,0],[0,1,0,1,0],[0,0,0,1,0]]

    输出:0

    解释:不移除任何障碍物就能从 (0, 0) 到 (2, 4) ,所以返回 0 。

    ```

    提示:

    • m == grid.length

    • n == grid[i].length

    • 1 <= m, n <= 10^5

    • 2 <= m * n <= 10^5

    • grid[i][j]0 1

    • grid[0][0] == grid[m - 1][n - 1] == 0

阅读全文 »

    6366. 在网格图中访问一个格子的最少时间


    给你一个 m x n 的矩阵 grid ,每个元素都为 非负 整数,其中 grid[row][col] 表示可以访问格子 (row, col) 的 最早 时间。也就是说当你访问格子 (row, col) 时,最少已经经过的时间为 grid[row][col] 。

    你从 最左上角 出发,出发时刻为 0 ,你必须一直移动到上下左右相邻四个格子中的 任意 一个格子(即不能停留在格子上)。每次移动都需要花费 1 单位时间。

    请你返回 最早 到达右下角格子的时间,如果你无法到达右下角的格子,请你返回 -1 。

    示例 1:

    ```txt

    输入:grid = [[0,1,3,2],[5,1,2,5],[4,3,8,6]]

    输出:7

    解释:一条可行的路径为:

    • 时刻 t = 0 ,我们在格子 (0,0) 。

    • 时刻 t = 1 ,我们移动到格子 (0,1) ,可以移动的原因是 grid[0][1] <= 1 。

    • 时刻 t = 2 ,我们移动到格子 (1,1) ,可以移动的原因是 grid[1][1] <= 2 。

    • 时刻 t = 3 ,我们移动到格子 (1,2) ,可以移动的原因是 grid[1][2] <= 3 。

    • 时刻 t = 4 ,我们移动到格子 (1,1) ,可以移动的原因是 grid[1][1] <= 4 。

    • 时刻 t = 5 ,我们移动到格子 (1,2) ,可以移动的原因是 grid[1][2] <= 5 。

    • 时刻 t = 6 ,我们移动到格子 (1,3) ,可以移动的原因是 grid[1][3] <= 6 。

    • 时刻 t = 7 ,我们移动到格子 (2,3) ,可以移动的原因是 grid[2][3] <= 7 。

    最终到达时刻为 7 。这是最早可以到达的时间。

    ```

    示例 2:

    ```txt

    输入:grid = [[0,2,4],[3,2,1],[1,0,4]]

    输出:-1

    解释:没法从左上角按题目规定走到右下角。

    ```

    提示:

    • m == grid.length

    • n == grid[i].length

    • 2 &lt;= m, n &lt;= 1000

    • 4 &lt;= m * n &lt;= 10^5

    • 0 &lt;= grid[i][j] &lt;= 10^5

    • grid[0][0] == 0

阅读全文 »

    6336. 设计可以求最短路径的图类


    给你一个有 n 个节点的 有向带权 图,节点编号为 0 到 n - 1 。图中的初始边用数组 edges 表示,其中 edges[i] = [fromi, toi, edgeCosti] 表示从 fromi 到 toi 有一条代价为 edgeCosti 的边。

    请你实现一个 Graph 类:

    • Graph(int n, int[][] edges) 初始化图有 n 个节点,并输入初始边。

    • addEdge(int[] edge) 向边集中添加一条边,其中 edge = [from, to, edgeCost] 。数据保证添加这条边之前对应的两个节点之间没有有向边。

    • int shortestPath(int node1, int node2) 返回从节点 node1 到 node2 的路径 最小 代价。如果路径不存在,返回 -1 。一条路径的代价是路径中所有边代价之和。

    示例 1:

    ```txt

    输入:

    ["Graph", "shortestPath", "shortestPath", "addEdge", "shortestPath"]

    [[4, [[0, 2, 5], [0, 1, 2], [1, 2, 1], [3, 0, 3]]], [3, 2], [0, 3], [[1, 3, 4]], [0, 3]]

    输出:

    [null, 6, -1, null, 6]

    解释:

    Graph g = new Graph(4, [[0, 2, 5], [0, 1, 2], [1, 2, 1], [3, 0, 3]]);

    g.shortestPath(3, 2); // 返回 6 。从 3 到 2 的最短路径如第一幅图所示:3 -> 0 -> 1 -> 2 ,总代价为 3 + 2 + 1 = 6 。

    g.shortestPath(0, 3); // 返回 -1 。没有从 0 到 3 的路径。

    g.addEdge([1, 3, 4]); // 添加一条节点 1 到节点 3 的边,得到第二幅图。

    g.shortestPath(0, 3); // 返回 6 。从 0 到 3 的最短路径为 0 -> 1 -> 3 ,总代价为 2 + 4 = 6 。

    ```

    提示:

    • 1 &lt;= n &lt;= 100

    • 0 &lt;= edges.length &lt;= n * (n - 1)

    • edges[i].length == edge.length == 3

    • 0 &lt;= fromi, toi, from, to, node1, node2 &lt;= n - 1

    • 1 &lt;= edgeCosti, edgeCost &lt;= 10^6

    • 图中任何时候都不会有重边和自环。

    • 调用 addEdge 至多 100 次。

    • 调用 shortestPath 至多 100 次。

阅读全文 »

    862. 和至少为 K 的最短子数组


    给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1

    子数组 是数组中 连续 的一部分。

    示例 1:

    ```txt

    输入:nums = [1], k = 1

    输出:1

    ```

    示例 2:

    ```txt

    输入:nums = [1,2], k = 4

    输出:-1

    ```

    示例 3:

    ```txt

    输入:nums = [2,-1,2], k = 3

    输出:3

    ```

    提示:

    • 1 &lt;= nums.length &lt;= 10^5

    • -10^5 &lt;= nums[i] &lt;= 10^5

    • 1 &lt;= k &lt;= 10^9

阅读全文 »

    2945. 找到最大非递减数组的长度


    给你一个下标从 0 开始的整数数组 nums 。

    你可以执行任意次操作。每次操作中,你需要选择一个 子数组 ,并将这个子数组用它所包含元素的  替换。比方说,给定数组是 [1,3,5,6] ,你可以选择子数组 [3,5] ,用子数组的和 8 替换掉子数组,然后数组会变为 [1,8,6] 。

    请你返回执行任意次操作以后,可以得到的 最长非递减 数组的长度。

    子数组 指的是一个数组中一段连续 非空 的元素序列。

    示例 1:

    ```txt

    输入:nums = [5,2,2]

    输出:1

    解释:这个长度为 3 的数组不是非递减的。

    我们有 2 种方案使数组长度为 2 。

    第一种,选择子数组 [2,2] ,对数组执行操作后得到 [5,4] 。

    第二种,选择子数组 [5,2] ,对数组执行操作后得到 [7,2] 。

    这两种方案中,数组最后都不是 非递减 的,所以不是可行的答案。

    如果我们选择子数组 [5,2,2] ,并将它替换为 [9] ,数组变成非递减的。

    所以答案为 1 。

    ```

    示例 2:

    ```txt

    输入:nums = [1,2,3,4]

    输出:4

    解释:数组已经是非递减的。所以答案为 4 。

    ```

    示例 3:

    ```txt

    输入:nums = [4,3,2,6]

    输出:3

    解释:将 [3,2] 替换为 [5] ,得到数组 [4,5,6] ,它是非递减的。

    最大可能的答案为 3 。

    ```

    提示:

    • 1 &lt;= nums.length &lt;= 10^5

    • 1 &lt;= nums[i] &lt;= 10^5

阅读全文 »

    2818. 操作使得分最大


    给你一个长度为 n 的正整数数组 nums 和一个整数 k 。

    一开始,你的分数为 1 。你可以进行以下操作至多 k 次,目标是使你的分数最大:

    • 选择一个之前没有选过的 非空 子数组 nums[l, ..., r] 。

    • 从 nums[l, ..., r] 里面选择一个 质数分数 最高的元素 x 。如果多个元素质数分数相同且最高,选择下标最小的一个。

    • 将你的分数乘以 x 。

    nums[l, ..., r] 表示 nums 中起始下标为 l ,结束下标为 r 的子数组,两个端点都包含。

    一个整数的 质数分数 等于 x 不同质因子的数目。比方说, 300 的质数分数为 3 ,因为 300 = 2 * 2 * 3 * 5 * 5 。

    请你返回进行至多 k 次操作后,可以得到的 最大分数 。

    由于答案可能很大,请你将结果对 10^9 + 7 取余后返回。

    示例 1:

    ```txt

    输入:nums = [8,3,9,3,8], k = 2

    输出:81

    解释:进行以下操作可以得到分数 81 :

    • 选择子数组 nums[2, ..., 2] 。nums[2] 是子数组中唯一的元素。所以我们将分数乘以 nums[2] ,分数变为 1 * 9 = 9 。

    • 选择子数组 nums[2, ..., 3] 。nums[2] 和 nums[3] 质数分数都为 1 ,但是 nums[2] 下标更小。所以我们将分数乘以 nums[2] ,分数变为 9 * 9 = 81 。

    81 是可以得到的最高得分。

    ```

    示例 2:

    ```txt

    输入:nums = [19,12,14,6,10,18], k = 3

    输出:4788

    解释:进行以下操作可以得到分数 4788 :

    • 选择子数组 nums[0, ..., 0] 。nums[0] 是子数组中唯一的元素。所以我们将分数乘以 nums[0] ,分数变为 1 * 19 = 19 。

    • 选择子数组 nums[5, ..., 5] 。nums[5] 是子数组中唯一的元素。所以我们将分数乘以 nums[5] ,分数变为 19 * 18 = 342 。

    • 选择子数组 nums[2, ..., 3] 。nums[2] 和 nums[3] 质数分数都为 2,但是 nums[2] 下标更小。所以我们将分数乘以 nums[2] ,分数变为 342 * 14 = 4788 。

    4788 是可以得到的最高的分。

    ```

    提示:

    • 1 &lt;= nums.length == n &lt;= 10^5

    • 1 &lt;= nums[i] &lt;= 10^5

    • 1 &lt;= k &lt;= min(n * (n + 1) / 2, 10^9)

阅读全文 »