comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
简单 |
|
给你一个 m x n
的二维数组 grid
,数组由 正整数 组成。
你的任务是以 之字形 遍历 grid
,同时跳过每个 交替 的单元格。
之字形遍历的定义如下:
- 从左上角的单元格
(0, 0)
开始。 - 在当前行中向 右 移动,直到到达该行的末尾。
- 下移到下一行,然后在该行中向 左 移动,直到到达该行的开头。
- 继续在行间交替向右和向左移动,直到所有行都被遍历完。
注意:在遍历过程中,必须跳过每个 交替 的单元格。
返回一个整数数组 result
,其中包含按 顺序 记录的、且跳过交替单元格后的之字形遍历中访问到的单元格值。
示例 1:
示例 2:
示例 3:
提示:
2 <= n == grid.length <= 50
2 <= m == grid[i].length <= 50
1 <= grid[i][j] <= 2500
我们遍历每一行,如果当前行的索引是奇数,我们就将这一行的元素逆序,然后遍历这一行的元素,按照题目要求的规则将元素加入答案数组中。
时间复杂度
class Solution:
def zigzagTraversal(self, grid: List[List[int]]) -> List[int]:
ok = True
ans = []
for i, row in enumerate(grid):
if i % 2:
row.reverse()
for x in row:
if ok:
ans.append(x)
ok = not ok
return ans
class Solution {
public List<Integer> zigzagTraversal(int[][] grid) {
boolean ok = true;
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < grid.length; ++i) {
if (i % 2 == 1) {
reverse(grid[i]);
}
for (int x : grid[i]) {
if (ok) {
ans.add(x);
}
ok = !ok;
}
}
return ans;
}
private void reverse(int[] nums) {
for (int i = 0, j = nums.length - 1; i < j; ++i, --j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
}
class Solution {
public:
vector<int> zigzagTraversal(vector<vector<int>>& grid) {
vector<int> ans;
bool ok = true;
for (int i = 0; i < grid.size(); ++i) {
if (i % 2 != 0) {
ranges::reverse(grid[i]);
}
for (int x : grid[i]) {
if (ok) {
ans.push_back(x);
}
ok = !ok;
}
}
return ans;
}
};
func zigzagTraversal(grid [][]int) (ans []int) {
ok := true
for i, row := range grid {
if i%2 != 0 {
slices.Reverse(row)
}
for _, x := range row {
if ok {
ans = append(ans, x)
}
ok = !ok
}
}
return
}
function zigzagTraversal(grid: number[][]): number[] {
const ans: number[] = [];
let ok: boolean = true;
for (let i = 0; i < grid.length; ++i) {
if (i % 2) {
grid[i].reverse();
}
for (const x of grid[i]) {
if (ok) {
ans.push(x);
}
ok = !ok;
}
}
return ans;
}