leetcode contest 340
最近遇到难度最大的一场周赛题目了,还是比较难的题目,不过越是难的题目越是有挑战。
2614. 对角线上的质数
给你一个下标从 0 开始的二维整数数组 nums
。
返回位于 nums
至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数,返回 0 。
注意:
- 如果某个整数大于
1
,且不存在除1
和自身之外的正整数因子,则认为该整数是一个质数。 - 如果存在整数
i
,使得nums[i][i] = val
或者nums[i][nums.length - i - 1]= val
,则认为整数val
位于nums
的一条对角线上。
在上图中,一条对角线是 [1,5,9] ,而另一条对角线是 [3,5,7] 。
示例 1:
输入:nums = [[1,2,3],[5,6,7],[9,10,11]] |
示例 2:
输入:nums = [[1,2,3],[5,17,7],[9,11,10]] |
提示:
1 <= nums.length <= 300
nums.length == numsi.length
1 <= nums[i][j] <= 4*106
地址
https://leetcode.cn/contest/weekly-contest-340/problems/prime-in-diagonal/
题意
直接检测
思路
- 直接检测矩阵中对角线上的每个元素即可。
- 复杂度分析:
- 时间复杂度:$O(n)$。
- 空间复杂度:$O(1)$。
代码
class Solution { |
2615. 等值距离和
给你一个下标从 0 开始的整数数组 nums
。现有一个长度等于 nums.length
的数组 arr
。对于满足 nums[j] == nums[i]
且 j != i
的所有 j
,arr[i]
等于所有 |i - j|
之和。如果不存在这样的 j
,则令 arr[i]
等于 0
。
返回数组 arr
。
示例 1:
输入:nums = [1,3,1,1,2] |
示例 2:
输入:nums = [0,5,3] |
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 109
地址
https://leetcode.cn/contest/weekly-contest-340/problems/sum-of-distances/
题意
直接枚举
思路
- 利用哈希表将相同的元素进行分组,分组完成后直接按照要求分组中所有的元素对某个元素的绝对值差的和即可。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 为数组的长度。
- 空间复杂度:$O(n)$。其中 $n$ 为数组的长度。
代码
class Solution { |
2616. 最小化数对的最大差值
给你一个下标从 0 开始的整数数组 nums
和一个整数 p
。请你从 nums
中找到 p
个下标对,每个下标对对应数值取差值,你需要使得这 p
个差值的 最大值 最小。同时,你需要确保每个下标在这 p
个下标对中最多出现一次。
对于一个下标对 i
和 j
,这一对的差值为 |nums[i] - nums[j]|
,其中 |x|
表示 x
的 绝对值 。
请你返回 p
个下标对对应数值 最大差值 的 最小值 。
示例 1:
输入:nums = [10,1,2,7,1,3], p = 2 |
示例 2:
输入:nums = [4,2,1,2], p = 1 |
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 109
0 <= p <= (nums.length)/2
地址
https://leetcode.cn/contest/weekly-contest-340/problems/minimize-the-maximum-difference-of-pairs/
题意
二分查找
思路
- 根据题目可以知道,一般遇到最大值的最小值,或者最小值的最大值,此时就需要用到二分查找;
- 我们需要观察一些特征:
- 如果可以选 $\textit{nums}[0]$ 和 $\textit{nums}[1]$,那么答案等于「n−2 个数的最多数对个数」+1。
- 如果不选 $\textit{nums}[0]$,那么答案等于「n−1个数的最多数对个数」。
- 这两种情况取最大值。
- 复杂度分析:
- 时间复杂度:$O(n \log U)$,其中 $n$ 为数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution { |
2617. 网格图中最少访问的格子数
给你一个下标从 0 开始的 m x n
整数矩阵 grid
。你一开始的位置在 左上角 格子 (0, 0)
。
当你在格子 (i, j)
的时候,你可以移动到以下格子之一:
- 满足
j < k <= grid[i][j] + j
的格子(i, k)
(向右移动),或者 - 满足
i < k <= grid[i][j] + i
的格子(k, j)
(向下移动)。
请你返回到达 右下角 格子 (m - 1, n - 1)
需要经过的最少移动格子数,如果无法到达右下角格子,请你返回 -1
。
示例 1:
输入:grid = [[3,4,2,1],[4,2,3,1],[2,1,0,0],[2,4,0,0]] |
示例 2:
输入:grid = [[3,4,2,1],[4,2,1,1],[2,1,1,0],[3,4,1,0]] |
示例 3:
输入:grid = [[2,1,0],[1,0,0]] |
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 105
1 <= m * n <= 105
0 <= grid[i][j] < m * n
grid[m - 1][n - 1] == 0
地址
https://leetcode.cn/contest/weekly-contest-340/problems/minimum-number-of-visited-cells-in-a-grid/
题意
BFS
思路
- 本题本质也是一个大号的跳跃游戏,因此我们可以参考
339
周T4
的题解来做这道题目。用treeset
存储每行和每列中未访问过的元素,假设当前方位的坐标为 $(x,y)$,此时我们操作如下:
- 在 $x$ 行中的元素找到属于区间 $[x * col + y, x * col + y + grid[x][y]]$ 的元素,此时我们直接将处于该区间的元素删除即可,同时也要在对应的列中删除未访问的元素;
- 在 $y$ 列中的元素找到属于区间 $[x * col + y, (x + grid[x][y])* col + y]$ 的元素,此时我们直接将处于该区间的元素删除即可,同时也要在对应的行中删除未访问的元素;
- 此时我们可以很快的利用二分查找即可找到区间的起点,然后依次从区间的起点开始遍历,边遍历边删除即可;
我们按照层次遍历的方式依次对当前可以访问的元素进行访问,直到到达终点即可。
复杂度分析:
- 时间复杂度:$O(m \times n \times(\log m + \log n))$,其中 $m$ 为节点的数目,$m$ 表示查询的次数。
- 空间复杂度:$O(m \times n)$,其中 $m$ 为节点的数目,$m$ 表示查询的次数。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章