Skip to content

Commit cb16e51

Browse files
authored
Create diagonal-traverse-ii.cpp
1 parent 0584ed8 commit cb16e51

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

C++/diagonal-traverse-ii.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Time: O(m * n)
2+
// Space: O(m)
3+
4+
class Solution {
5+
public:
6+
vector<int> findDiagonalOrder(vector<vector<int>>& nums) {
7+
const auto& n = accumulate(nums.cbegin(), nums.cend(), uint64_t(0ull),
8+
[](const auto& x, const auto& y) {
9+
return max(x, y.size());
10+
});
11+
vector<int> result;
12+
vector<pair<int, int>> q;
13+
for (int r = 0; r < nums.size() + n - 1; ++r) {
14+
vector<pair<int, int>> new_q;
15+
if (r < nums.size()) {
16+
q.emplace_back(r, 0);
17+
}
18+
for (int i = q.size() - 1; i >= 0; --i) {
19+
const auto& [r, c] = q[i];
20+
result.emplace_back(nums[r][c]);
21+
if (c + 1 < nums[r].size()) {
22+
new_q.emplace_back(r, c + 1);
23+
}
24+
}
25+
reverse(new_q.begin(), new_q.end());
26+
q = move(new_q);
27+
}
28+
return result;
29+
}
30+
};
31+
32+
// Time: O(m * n)
33+
// Space: O(m * n)
34+
class Solution2 {
35+
public:
36+
vector<int> findDiagonalOrder(vector<vector<int>>& nums) {
37+
vector<vector<int>> ans;
38+
for (int r = 0; r < nums.size(); ++r) {
39+
for (int c = 0; c < nums[r].size(); ++c) {
40+
if (ans.size() <= r + c) {
41+
ans.emplace_back();
42+
}
43+
ans[r + c].emplace_back(nums[r][c]);
44+
}
45+
}
46+
vector<int> result;
47+
for (const auto& row: ans) {
48+
for (int i = row.size() - 1; i >= 0; --i) {
49+
result.emplace_back(row[i]);
50+
}
51+
}
52+
return result;
53+
}
54+
};

0 commit comments

Comments
 (0)