0%

    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)

阅读全文 »

    1096. 花括号展开 II


    如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。

    花括号展开的表达式可以看作一个由 花括号逗号小写英文字母 组成的字符串,定义下面几条语法规则:

    • 如果只给出单一的元素 x,那么表达式表示的字符串就只有 &quot;x&quot;R(x) = {x}

      • 例如,表达式 &quot;a&quot; 表示字符串 &quot;a&quot;

      • 而表达式 &quot;w&quot; 就表示字符串 &quot;w&quot;

    • 当两个或多个表达式并列,以逗号分隔,我们取这些表达式中元素的并集。R({e_1,e_2,...}) = R(e_1) ∪ R(e_2) ∪ ...

      • 例如,表达式 &quot;{a,b,c}&quot; 表示字符串 &quot;a&quot;,&quot;b&quot;,&quot;c&quot;

      • 而表达式 &quot;{{a,b},{b,c}}&quot; 也可以表示字符串 &quot;a&quot;,&quot;b&quot;,&quot;c&quot;

    • 要是两个或多个表达式相接,中间没有隔开时,我们从这些表达式中各取一个元素依次连接形成字符串。R(e_1 + e_2) = {a + b for (a, b) in R(e_1) × R(e_2)}

      • 例如,表达式 &quot;{a,b}{c,d}&quot; 表示字符串 &quot;ac&quot;,&quot;ad&quot;,&quot;bc&quot;,&quot;bd&quot;
    • 表达式之间允许嵌套,单一元素与表达式的连接也是允许的。

      • 例如,表达式 &quot;a{b,c,d}&quot; 表示字符串 &quot;ab&quot;,&quot;ac&quot;,&quot;ad&quot;​​​​​​

      • 例如,表达式 &quot;a{b,c}{d,e}f{g,h}&quot; 可以表示字符串 &quot;abdfg&quot;, &quot;abdfh&quot;, &quot;abefg&quot;, &quot;abefh&quot;, &quot;acdfg&quot;, &quot;acdfh&quot;, &quot;acefg&quot;, &quot;acefh&quot;

    给出表示基于给定语法规则的表达式 expression,返回它所表示的所有字符串组成的有序列表。

    假如你希望以「集合」的概念了解此题,也可以通过点击 “显示英文描述” 获取详情。

    示例 1:

    ```txt

    输入:expression = "{a,b}{c,{d,e}}"

    输出:["ac","ad","ae","bc","bd","be"]

    ```

    示例 2:

    ```txt

    输入:expression = "{{a,z},a{b,c},{ab,z}}"

    输出:["a","ab","ac","z"]

    解释:输出中 不应 出现重复的组合结果。

    ```

    提示:

    • 1 &lt;= expression.length &lt;= 60

    • expression[i]&#x27;{&#x27;&#x27;}&#x27;&#x27;,&#x27; 或小写英文字母组成

    • 给出的表达式 expression 用以表示一组基于题目描述中语法构造的字符串

阅读全文 »