Skip to content

Commit 4b32591

Browse files
authored
feat: add solutions to lc problems: No.1329,3126 (#2681)
* No.1329.Sort the Matrix Diagonally * No.3126.Server Utilization Time
1 parent dcaf658 commit 4b32591

File tree

12 files changed

+435
-84
lines changed

12 files changed

+435
-84
lines changed

solution/1300-1399/1329.Sort the Matrix Diagonally/README.md

+134-27
Original file line numberDiff line numberDiff line change
@@ -43,35 +43,51 @@
4343

4444
## 解法
4545

46-
### 方法一
46+
### 方法一:排序
47+
48+
我们可以将矩阵中的每条对角线看作一个数组,然后对这些数组进行排序,最后再将排序后的元素填回原矩阵中。
49+
50+
具体地,我们记矩阵的行数为 $m$,列数为 $n$。由于同一条对角线上的任意两个元素 $(i_1, j_1)$ 和 $(i_2, j_2)$ 满足 $j_1 - i_1 = j_2 - i_2$,我们可以根据 $j - i$ 的值来确定每条对角线。为了保证值为正数,我们加上一个偏移量 $m$,即 $m - i + j$。
51+
52+
最后,我们将每条对角线上的元素排序后填回原矩阵中即可。
53+
54+
时间复杂度 $O(m \times n \times \log \min(m, n))$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
4755

4856
<!-- tabs:start -->
4957

5058
```python
5159
class Solution:
5260
def diagonalSort(self, mat: List[List[int]]) -> List[List[int]]:
5361
m, n = len(mat), len(mat[0])
54-
for k in range(min(m, n) - 1):
55-
for i in range(m - 1):
56-
for j in range(n - 1):
57-
if mat[i][j] > mat[i + 1][j + 1]:
58-
mat[i][j], mat[i + 1][j + 1] = mat[i + 1][j + 1], mat[i][j]
62+
g = [[] for _ in range(m + n)]
63+
for i, row in enumerate(mat):
64+
for j, x in enumerate(row):
65+
g[m - i + j].append(x)
66+
for e in g:
67+
e.sort(reverse=True)
68+
for i in range(m):
69+
for j in range(n):
70+
mat[i][j] = g[m - i + j].pop()
5971
return mat
6072
```
6173

6274
```java
6375
class Solution {
6476
public int[][] diagonalSort(int[][] mat) {
6577
int m = mat.length, n = mat[0].length;
66-
for (int k = 0; k < Math.min(m, n) - 1; ++k) {
67-
for (int i = 0; i < m - 1; ++i) {
68-
for (int j = 0; j < n - 1; ++j) {
69-
if (mat[i][j] > mat[i + 1][j + 1]) {
70-
int t = mat[i][j];
71-
mat[i][j] = mat[i + 1][j + 1];
72-
mat[i + 1][j + 1] = t;
73-
}
74-
}
78+
List<Integer>[] g = new List[m + n];
79+
Arrays.setAll(g, k -> new ArrayList<>());
80+
for (int i = 0; i < m; ++i) {
81+
for (int j = 0; j < n; ++j) {
82+
g[m - i + j].add(mat[i][j]);
83+
}
84+
}
85+
for (var e : g) {
86+
Collections.sort(e, (a, b) -> b - a);
87+
}
88+
for (int i = 0; i < m; ++i) {
89+
for (int j = 0; j < n; ++j) {
90+
mat[i][j] = g[m - i + j].removeLast();
7591
}
7692
}
7793
return mat;
@@ -84,11 +100,21 @@ class Solution {
84100
public:
85101
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {
86102
int m = mat.size(), n = mat[0].size();
87-
for (int k = 0; k < min(m, n) - 1; ++k)
88-
for (int i = 0; i < m - 1; ++i)
89-
for (int j = 0; j < n - 1; ++j)
90-
if (mat[i][j] > mat[i + 1][j + 1])
91-
swap(mat[i][j], mat[i + 1][j + 1]);
103+
vector<int> g[m + n];
104+
for (int i = 0; i < m; ++i) {
105+
for (int j = 0; j < n; ++j) {
106+
g[m - i + j].push_back(mat[i][j]);
107+
}
108+
}
109+
for (auto& e : g) {
110+
sort(e.rbegin(), e.rend());
111+
}
112+
for (int i = 0; i < m; ++i) {
113+
for (int j = 0; j < n; ++j) {
114+
mat[i][j] = g[m - i + j].back();
115+
g[m - i + j].pop_back();
116+
}
117+
}
92118
return mat;
93119
}
94120
};
@@ -97,19 +123,100 @@ public:
97123
```go
98124
func diagonalSort(mat [][]int) [][]int {
99125
m, n := len(mat), len(mat[0])
100-
for k := 0; k < m-1 && k < n-1; k++ {
101-
for i := 0; i < m-1; i++ {
102-
for j := 0; j < n-1; j++ {
103-
if mat[i][j] > mat[i+1][j+1] {
104-
mat[i][j], mat[i+1][j+1] = mat[i+1][j+1], mat[i][j]
105-
}
106-
}
126+
g := make([][]int, m+n)
127+
for i, row := range mat {
128+
for j, x := range row {
129+
g[m-i+j] = append(g[m-i+j], x)
130+
}
131+
}
132+
for _, e := range g {
133+
sort.Sort(sort.Reverse(sort.IntSlice(e)))
134+
}
135+
for i, row := range mat {
136+
for j := range row {
137+
k := len(g[m-i+j])
138+
mat[i][j] = g[m-i+j][k-1]
139+
g[m-i+j] = g[m-i+j][:k-1]
107140
}
108141
}
109142
return mat
110143
}
111144
```
112145

146+
```ts
147+
function diagonalSort(mat: number[][]): number[][] {
148+
const [m, n] = [mat.length, mat[0].length];
149+
const g: number[][] = Array.from({ length: m + n }, () => []);
150+
for (let i = 0; i < m; ++i) {
151+
for (let j = 0; j < n; ++j) {
152+
g[m - i + j].push(mat[i][j]);
153+
}
154+
}
155+
for (const e of g) {
156+
e.sort((a, b) => b - a);
157+
}
158+
for (let i = 0; i < m; ++i) {
159+
for (let j = 0; j < n; ++j) {
160+
mat[i][j] = g[m - i + j].pop()!;
161+
}
162+
}
163+
return mat;
164+
}
165+
```
166+
167+
```rust
168+
impl Solution {
169+
pub fn diagonal_sort(mut mat: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
170+
let m = mat.len();
171+
let n = mat[0].len();
172+
let mut g: Vec<Vec<i32>> = vec![vec![]; m + n];
173+
for i in 0..m {
174+
for j in 0..n {
175+
g[m - i + j].push(mat[i][j]);
176+
}
177+
}
178+
for e in &mut g {
179+
e.sort_by(|a, b| b.cmp(a));
180+
}
181+
for i in 0..m {
182+
for j in 0..n {
183+
mat[i][j] = g[m - i + j].pop().unwrap();
184+
}
185+
}
186+
mat
187+
}
188+
}
189+
```
190+
191+
```cs
192+
public class Solution {
193+
public int[][] DiagonalSort(int[][] mat) {
194+
int m = mat.Length;
195+
int n = mat[0].Length;
196+
List<List<int>> g = new List<List<int>>();
197+
for (int i = 0; i < m + n; i++) {
198+
g.Add(new List<int>());
199+
}
200+
for (int i = 0; i < m; i++) {
201+
for (int j = 0; j < n; j++) {
202+
g[m - i + j].Add(mat[i][j]);
203+
}
204+
}
205+
foreach (var e in g) {
206+
e.Sort((a, b) => b.CompareTo(a));
207+
}
208+
for (int i = 0; i < m; i++) {
209+
for (int j = 0; j < n; j++) {
210+
int val = g[m - i + j][g[m - i + j].Count - 1];
211+
g[m - i + j].RemoveAt(g[m - i + j].Count - 1);
212+
mat[i][j] = val;
213+
}
214+
}
215+
return mat;
216+
}
217+
}
218+
```
219+
113220
<!-- tabs:end -->
114221

115222
<!-- end -->

0 commit comments

Comments
 (0)