力扣163场周赛[链接][https://leetcode-cn.com/contest/weekly-contest-163]
本周总结,菜过两题,第三题思路不太行,没写出来,只能最后来补了。。。。
第一题:模拟题
5263.二维网格迁移
给你一个 n
行 m
列的二维网格 grid
和一个整数 k
。你需要将 grid
迁移 k
次。
每次「迁移」操作将会引发下述活动:
- 位于
grid[i][j]
的元素将会移动到grid[i][j + 1]
。 - 位于
grid[i][m - 1]
的元素将会移动到grid[i + 1][0]
。 - 位于
grid[n - 1][m - 1]
的元素将会移动到grid[0][0]
。
请你返回 k
次迁移操作后最终得到的 二维网格。
示例 1:
1 | 输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1 |
示例 2:
1 | 输入:grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4 |
示例 3:
1 | 输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9 |
提示:
1 <= grid.length <= 50
1 <= grid[i].length <= 50
-1000 <= grid[i][j] <= 1000
0 <= k <= 100
算法描述
找到变换后的起始位置,按位置一次添加到新数组中,每添加一个元素,k
的值++
,k=k%(m*n)
,最后返回更新后的数组。使用java
解题的时候,需要将二维数组转换到二维列表中再返回结果;
C++代码
1 | class Solution { |
Java代码
1 | class Solution { |
第二题:树的遍历
5264. 在受污染的二叉树中查找元素
给出一个满足下述规则的二叉树:
root.val == 0
- 如果
treeNode.val == x
且treeNode.left != null
,那么treeNode.left.val == 2 * x + 1
- 如果
treeNode.val == x
且treeNode.right != null
,那么treeNode.right.val == 2 * x + 2
现在这个二叉树受到「污染」,所有的 treeNode.val
都变成了 -1
。
请你先还原二叉树,然后实现 FindElements
类:
FindElements(TreeNode* root)
用受污染的二叉树初始化对象,你需要先把它还原。bool find(int target)
判断目标值target
是否存在于还原后的二叉树中并返回结果。
示例 1:
1 | 输入: |
示例 2:
1 | 输入: |
示例 3:
1 | 输入: |
提示:
TreeNode.val == -1
- 二叉树的高度不超过
20
- 节点的总数在
[1, 10^4]
之间 - 调用
find()
的总次数在[1, 10^4]
之间 0 <= target <= 10^6
算法描述
写一个dfs
将每一个节点的值按要求赋值,进行深度优先遍历,直到叶子节点返回,在遍历的过程中将过程中的值放入HashSet
中,为下面的find
操作准备,每次建树后都会将节点值放入set
,在要找树种是否含有该元素的时候直接用O(1)
的复杂度就能完成
C++代码
1 | /** |
Java代码
1 | /** |
第三题:逻辑思维题
5265. 可被三整除的最大和
给你一个整数数组 nums
,请你找出并返回能被三整除的元素最大和。
示例 1:
1 | 输入:nums = [3,6,5,1,8] |
示例 2:
1 | 输入:nums = [4] |
示例 3:
1 | 输入:nums = [1,2,3,4,4] |
提示:
1 <= nums.length <= 4 * 10^4
1 <= nums[i] <= 10^4
算法描述
操作分一下几步:
- 将数组的所有元素求和,在求和过程中将余数为
1
和2
的单独存放在两个数组中 - 将所有元素的和与
3
取余,结果为1
或2
- 结果为
1
,存放1的数组长度大于1
和存放2
的数组长度大于1
时,比较剪掉哪个使得值最大,返回结果 - 如果不满足以上两个情况,满足其中一个,对应一种结果,例如余数为1的数组长度大于
1
,另一个等于0
,最后只能返回的就是结果集减去a1[0]
- 结果为
2
也是同一操作 - 结果为
3
直接返回
C++代码
1 | class Solution { |
Java代码
1 | class Solution { |
第四题:搜索题
5266. 推箱子
「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。
游戏地图用大小为 n * m
的网格 grid
表示,其中每个元素可以是墙、地板或者是箱子。
现在你将作为玩家参与游戏,按规则将箱子 'B'
移动到目标位置 'T'
:
- 玩家用字符
'S'
表示,只要他在地板上,就可以在网格中向上、下、左、右四个方向移动。 - 地板用字符
'.'
表示,意味着可以自由行走。 - 墙用字符
'#'
表示,意味着障碍物,不能通行。 - 箱子仅有一个,用字符
'B'
表示。相应地,网格上有一个目标位置'T'
。 - 玩家需要站在箱子旁边,然后沿着箱子的方向进行移动,此时箱子会被移动到相邻的地板单元格。记作一次「推动」。
- 玩家无法越过箱子。
返回将箱子推到目标位置的最小 推动 次数,如果无法做到,请返回 -1
。
示例 1:
1 | 输入:grid = [["#","#","#","#","#","#"], |
示例 2:
1 | 输入:grid = [["#","#","#","#","#","#"], |
示例 3:
1 | 输入:grid = [["#","#","#","#","#","#"], |
示例 4:
1 | 输入:grid = [["#","#","#","#","#","#","#"], |
提示:
1 <= grid.length <= 20
1 <= grid[i].length <= 20
grid
仅包含字符'.'
,'#'
,'S'
,'T'
, 以及'B'
。grid
中'S'
,'B'
和'T'
各只能出现一个。