力扣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 <= 501 <= grid[i].length <= 50-1000 <= grid[i][j] <= 10000 <= 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^41 <= 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 <= 201 <= grid[i].length <= 20grid仅包含字符'.','#','S','T', 以及'B'。grid中'S','B'和'T'各只能出现一个。