The main idea is to simulate the zigzag traversal row by row, alternating direction, and skip every alternate cell by toggling a flag. We only add a cell to the result if it is not skipped.
classSolution {
public List<Integer>zigzagTraversal(int[][] grid) {
List<Integer> ans =new ArrayList<>();
boolean skip =false;
int n = grid.length, m = grid[0].length;
for (int i = 0; i < n; i++) {
if (i % 2 == 0) {
for (int j = 0; j < m; j++) {
if (!skip) ans.add(grid[i][j]);
skip =!skip;
}
} else {
for (int j = m - 1; j >= 0; j--) {
if (!skip) ans.add(grid[i][j]);
skip =!skip;
}
}
}
return ans;
}
}
classSolution {
funzigzagTraversal(grid: Array<IntArray>): List<Int> {
val ans = mutableListOf<Int>()
var skip = falseval n = grid.size
val m = grid[0].size
for (i in0 until n) {
if (i % 2==0) {
for (j in0 until m) {
if (!skip) ans.add(grid[i][j])
skip = !skip
}
} else {
for (j in m - 1 downTo 0) {
if (!skip) ans.add(grid[i][j])
skip = !skip
}
}
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
from typing import List
classSolution:
defzigzagTraversal(self, grid: List[List[int]]) -> List[int]:
ans: List[int] = []
skip =False n, m = len(grid), len(grid[0])
for i in range(n):
rng = range(m) if i %2==0else range(m-1, -1, -1)
for j in rng:
ifnot skip:
ans.append(grid[i][j])
skip =not skip
return ans
impl Solution {
pubfnzigzag_traversal(grid: Vec<Vec<i32>>) -> Vec<i32> {
let n = grid.len();
let m = grid[0].len();
letmut ans = Vec::new();
letmut skip =false;
for i in0..n {
if i %2==0 {
for j in0..m {
if!skip {
ans.push(grid[i][j]);
}
skip =!skip;
}
} else {
for j in (0..m).rev() {
if!skip {
ans.push(grid[i][j]);
}
skip =!skip;
}
}
}
ans
}
}