给你一个 m x n 的字符矩阵 box ,它表示一个箱子的侧视图。箱子的每一个格子可能为:
'#'
表示石头'*'
表示固定的障碍物'.'
表示空位置
这个箱子被 顺时针旋转 90 度 ,由于重力原因,部分石头的位置会发生改变。
每个石头会垂直掉落,直到它遇到障碍物,另一个石头或者箱子的底部。
重力 不会 影响障碍物的位置,同时箱子旋转不会产生惯性 ,也就是说石头的水平位置不会发生改变。题目保证初始时 box 中的石头要么在一个障碍物上,要么在另一个石头上,要么在箱子的底部。
请你返回一个 n x m
的矩阵,表示按照上述旋转后,箱子内的结果。
示例 1:
输入:box = [["#",".","#"]]
输出:[["."],
["#"],
["#"]]
示例 2:
输入:box = [["#",".","*","."],
["#","#","*","."]]
输出:[["#","."],
["#","#"],
["*","*"],
[".","."]]
示例 3:
输入:box = [["#","#","*",".","*","."],
["#","#","#","*",".","."],
["#","#","#",".","#","."]]
输出:[[".","#","#"],
[".","#","#"],
["#","#","*"],
["#","*","."],
["#",".","*"],
["#",".","."]]
提示:
m == box.length
n == box[i].length
1 <= m, n <= 500
box[i][j] 只可能是 '#' ,'*' 或者 '.' 。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotating-the-box 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
vector<vector<char>> rotateTheBox(vector<vector<char>>& box) {
int m = box.size(), n = box[0].size();
vector<vector<char>> ans(n, vector<char>(m, '.'));
for(int i = 0; i < m; ++i)
{
int sum = 0;
vector<int> presum(n,0);
for(int j = 0; j < n; ++j)
{
if(box[i][j] == '#')
sum++;
else if(box[i][j] == '*')
{
sum = 0;
ans[j][m-1-i] = '*';//障碍物填上
}
presum[j] = sum;
}
int s = -1;
for(int j = n-1; j >= 0; --j)//从底部开始摆
{
if(presum[j] > 0 && s == -1)
s = presum[j];
else if(presum[j] == 0)
s = -1;
if(s > 0)//有剩余的石头可摆
{
ans[j][m-1-i] = '#';
s--;
}
}
}
return ans;
}
};
292 ms 57.1 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!