Skip to content

Commit bcd38ce

Browse files
committed
feat: add solutions to lc problem: No.2033
No.2033.Minimum Operations to Make a Uni-Value Grid
1 parent a71b5da commit bcd38ce

File tree

6 files changed

+104
-96
lines changed

6 files changed

+104
-96
lines changed

solution/2000-2099/2033.Minimum Operations to Make a Uni-Value Grid/README.md

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@
6464

6565
<!-- 这里可写通用的实现逻辑 -->
6666

67+
**方法一:贪心**
68+
69+
首先,要使得网格化为单值网格,那么网格的所有元素与 $x$ 的余数必须相同。
70+
71+
因此,我们可以先遍历网格,判断所有元素与 $x$ 的余数是否相同,若不同则返回 $-1$。否则,我们将所有元素放入数组中,对数组进行排序,取中位数,然后遍历数组,计算每个元素与中位数的差值,再除以 $x$,将所有的差值相加,即为答案。
72+
73+
时间复杂度 $O((m \times n) \times \log (m \times n))$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为网格的行数和列数。
74+
6775
<!-- tabs:start -->
6876

6977
### **Python3**
@@ -74,19 +82,15 @@
7482
class Solution:
7583
def minOperations(self, grid: List[List[int]], x: int) -> int:
7684
nums = []
77-
m, n = len(grid), len(grid[0])
78-
base = grid[0][0]
79-
for i in range(m):
80-
for j in range(n):
81-
if abs(grid[i][j] - base) % x != 0:
85+
mod = grid[0][0] % x
86+
for row in grid:
87+
for v in row:
88+
if v % x != mod:
8289
return -1
83-
nums.append(grid[i][j])
90+
nums.append(v)
8491
nums.sort()
8592
mid = nums[len(nums) >> 1]
86-
ans = 0
87-
for num in nums:
88-
ans += abs(num - mid) // x
89-
return ans
93+
return sum(abs(v - mid) // x for v in nums)
9094
```
9195

9296
### **Java**
@@ -98,10 +102,10 @@ class Solution {
98102
public int minOperations(int[][] grid, int x) {
99103
int m = grid.length, n = grid[0].length;
100104
int[] nums = new int[m * n];
101-
int base = grid[0][0];
105+
int mod = grid[0][0] % x;
102106
for (int i = 0; i < m; ++i) {
103107
for (int j = 0; j < n; ++j) {
104-
if (Math.abs(base - grid[i][j]) % x != 0) {
108+
if (grid[i][j] % x != mod) {
105109
return -1;
106110
}
107111
nums[i * n + j] = grid[i][j];
@@ -110,8 +114,8 @@ class Solution {
110114
Arrays.sort(nums);
111115
int mid = nums[nums.length >> 1];
112116
int ans = 0;
113-
for (int num : nums) {
114-
ans += (Math.abs(num - mid) / x);
117+
for (int v : nums) {
118+
ans += Math.abs(v - mid) / x;
115119
}
116120
return ans;
117121
}
@@ -124,19 +128,23 @@ class Solution {
124128
class Solution {
125129
public:
126130
int minOperations(vector<vector<int>>& grid, int x) {
127-
vector<int> nums;
128131
int m = grid.size(), n = grid[0].size();
129-
int base = grid[0][0];
132+
int mod = grid[0][0] % x;
133+
int nums[m * n];
130134
for (int i = 0; i < m; ++i) {
131135
for (int j = 0; j < n; ++j) {
132-
if (abs(grid[i][j] - base) % x != 0) return -1;
133-
nums.push_back(grid[i][j]);
136+
if (grid[i][j] % x != mod) {
137+
return -1;
138+
}
139+
nums[i * n + j] = grid[i][j];
134140
}
135141
}
136-
sort(nums.begin(), nums.end());
137-
int mid = nums[nums.size() >> 1];
142+
sort(nums, nums + m * n);
143+
int mid = nums[(m * n) >> 1];
138144
int ans = 0;
139-
for (int num : nums) ans += abs(num - mid) / x;
145+
for (int v : nums) {
146+
ans += abs(v - mid) / x;
147+
}
140148
return ans;
141149
}
142150
};
@@ -146,30 +154,30 @@ public:
146154
147155
```go
148156
func minOperations(grid [][]int, x int) int {
149-
var nums []int
150-
m, n, base := len(grid), len(grid[0]), grid[0][0]
151-
for i := 0; i < m; i++ {
152-
for j := 0; j < n; j++ {
153-
if abs(grid[i][j]-base)%x != 0 {
157+
mod := grid[0][0] % x
158+
nums := []int{}
159+
for _, row := range grid {
160+
for _, v := range row {
161+
if v%x != mod {
154162
return -1
155163
}
156-
nums = append(nums, grid[i][j])
164+
nums = append(nums, v)
157165
}
158166
}
159167
sort.Ints(nums)
160168
mid := nums[len(nums)>>1]
161169
ans := 0
162-
for _, num := range nums {
163-
ans += abs(num-mid) / x
170+
for _, v := range nums {
171+
ans += abs(v-mid) / x
164172
}
165173
return ans
166174
}
167175
168176
func abs(x int) int {
169-
if x > 0 {
170-
return x
177+
if x < 0 {
178+
return -x
171179
}
172-
return -x
180+
return x
173181
}
174182
```
175183

solution/2000-2099/2033.Minimum Operations to Make a Uni-Value Grid/README_EN.md

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,15 @@ A total of 4 operations were used.
6060
class Solution:
6161
def minOperations(self, grid: List[List[int]], x: int) -> int:
6262
nums = []
63-
m, n = len(grid), len(grid[0])
64-
base = grid[0][0]
65-
for i in range(m):
66-
for j in range(n):
67-
if abs(grid[i][j] - base) % x != 0:
63+
mod = grid[0][0] % x
64+
for row in grid:
65+
for v in row:
66+
if v % x != mod:
6867
return -1
69-
nums.append(grid[i][j])
68+
nums.append(v)
7069
nums.sort()
7170
mid = nums[len(nums) >> 1]
72-
ans = 0
73-
for num in nums:
74-
ans += abs(num - mid) // x
75-
return ans
71+
return sum(abs(v - mid) // x for v in nums)
7672
```
7773

7874
### **Java**
@@ -82,10 +78,10 @@ class Solution {
8278
public int minOperations(int[][] grid, int x) {
8379
int m = grid.length, n = grid[0].length;
8480
int[] nums = new int[m * n];
85-
int base = grid[0][0];
81+
int mod = grid[0][0] % x;
8682
for (int i = 0; i < m; ++i) {
8783
for (int j = 0; j < n; ++j) {
88-
if (Math.abs(base - grid[i][j]) % x != 0) {
84+
if (grid[i][j] % x != mod) {
8985
return -1;
9086
}
9187
nums[i * n + j] = grid[i][j];
@@ -94,8 +90,8 @@ class Solution {
9490
Arrays.sort(nums);
9591
int mid = nums[nums.length >> 1];
9692
int ans = 0;
97-
for (int num : nums) {
98-
ans += (Math.abs(num - mid) / x);
93+
for (int v : nums) {
94+
ans += Math.abs(v - mid) / x;
9995
}
10096
return ans;
10197
}
@@ -108,19 +104,23 @@ class Solution {
108104
class Solution {
109105
public:
110106
int minOperations(vector<vector<int>>& grid, int x) {
111-
vector<int> nums;
112107
int m = grid.size(), n = grid[0].size();
113-
int base = grid[0][0];
108+
int mod = grid[0][0] % x;
109+
int nums[m * n];
114110
for (int i = 0; i < m; ++i) {
115111
for (int j = 0; j < n; ++j) {
116-
if (abs(grid[i][j] - base) % x != 0) return -1;
117-
nums.push_back(grid[i][j]);
112+
if (grid[i][j] % x != mod) {
113+
return -1;
114+
}
115+
nums[i * n + j] = grid[i][j];
118116
}
119117
}
120-
sort(nums.begin(), nums.end());
121-
int mid = nums[nums.size() >> 1];
118+
sort(nums, nums + m * n);
119+
int mid = nums[(m * n) >> 1];
122120
int ans = 0;
123-
for (int num : nums) ans += abs(num - mid) / x;
121+
for (int v : nums) {
122+
ans += abs(v - mid) / x;
123+
}
124124
return ans;
125125
}
126126
};
@@ -130,30 +130,30 @@ public:
130130
131131
```go
132132
func minOperations(grid [][]int, x int) int {
133-
var nums []int
134-
m, n, base := len(grid), len(grid[0]), grid[0][0]
135-
for i := 0; i < m; i++ {
136-
for j := 0; j < n; j++ {
137-
if abs(grid[i][j]-base)%x != 0 {
133+
mod := grid[0][0] % x
134+
nums := []int{}
135+
for _, row := range grid {
136+
for _, v := range row {
137+
if v%x != mod {
138138
return -1
139139
}
140-
nums = append(nums, grid[i][j])
140+
nums = append(nums, v)
141141
}
142142
}
143143
sort.Ints(nums)
144144
mid := nums[len(nums)>>1]
145145
ans := 0
146-
for _, num := range nums {
147-
ans += abs(num-mid) / x
146+
for _, v := range nums {
147+
ans += abs(v-mid) / x
148148
}
149149
return ans
150150
}
151151
152152
func abs(x int) int {
153-
if x > 0 {
154-
return x
153+
if x < 0 {
154+
return -x
155155
}
156-
return -x
156+
return x
157157
}
158158
```
159159

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
class Solution {
22
public:
33
int minOperations(vector<vector<int>>& grid, int x) {
4-
vector<int> nums;
54
int m = grid.size(), n = grid[0].size();
6-
int base = grid[0][0];
5+
int mod = grid[0][0] % x;
6+
int nums[m * n];
77
for (int i = 0; i < m; ++i) {
88
for (int j = 0; j < n; ++j) {
9-
if (abs(grid[i][j] - base) % x != 0) return -1;
10-
nums.push_back(grid[i][j]);
9+
if (grid[i][j] % x != mod) {
10+
return -1;
11+
}
12+
nums[i * n + j] = grid[i][j];
1113
}
1214
}
13-
sort(nums.begin(), nums.end());
14-
int mid = nums[nums.size() >> 1];
15+
sort(nums, nums + m * n);
16+
int mid = nums[(m * n) >> 1];
1517
int ans = 0;
16-
for (int num : nums) ans += abs(num - mid) / x;
18+
for (int v : nums) {
19+
ans += abs(v - mid) / x;
20+
}
1721
return ans;
1822
}
1923
};
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
func minOperations(grid [][]int, x int) int {
2-
var nums []int
3-
m, n, base := len(grid), len(grid[0]), grid[0][0]
4-
for i := 0; i < m; i++ {
5-
for j := 0; j < n; j++ {
6-
if abs(grid[i][j]-base)%x != 0 {
2+
mod := grid[0][0] % x
3+
nums := []int{}
4+
for _, row := range grid {
5+
for _, v := range row {
6+
if v%x != mod {
77
return -1
88
}
9-
nums = append(nums, grid[i][j])
9+
nums = append(nums, v)
1010
}
1111
}
1212
sort.Ints(nums)
1313
mid := nums[len(nums)>>1]
1414
ans := 0
15-
for _, num := range nums {
16-
ans += abs(num-mid) / x
15+
for _, v := range nums {
16+
ans += abs(v-mid) / x
1717
}
1818
return ans
1919
}
2020

2121
func abs(x int) int {
22-
if x > 0 {
23-
return x
22+
if x < 0 {
23+
return -x
2424
}
25-
return -x
25+
return x
2626
}

solution/2000-2099/2033.Minimum Operations to Make a Uni-Value Grid/Solution.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ class Solution {
22
public int minOperations(int[][] grid, int x) {
33
int m = grid.length, n = grid[0].length;
44
int[] nums = new int[m * n];
5-
int base = grid[0][0];
5+
int mod = grid[0][0] % x;
66
for (int i = 0; i < m; ++i) {
77
for (int j = 0; j < n; ++j) {
8-
if (Math.abs(base - grid[i][j]) % x != 0) {
8+
if (grid[i][j] % x != mod) {
99
return -1;
1010
}
1111
nums[i * n + j] = grid[i][j];
@@ -14,8 +14,8 @@ public int minOperations(int[][] grid, int x) {
1414
Arrays.sort(nums);
1515
int mid = nums[nums.length >> 1];
1616
int ans = 0;
17-
for (int num : nums) {
18-
ans += (Math.abs(num - mid) / x);
17+
for (int v : nums) {
18+
ans += Math.abs(v - mid) / x;
1919
}
2020
return ans;
2121
}
Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
class Solution:
22
def minOperations(self, grid: List[List[int]], x: int) -> int:
33
nums = []
4-
m, n = len(grid), len(grid[0])
5-
base = grid[0][0]
6-
for i in range(m):
7-
for j in range(n):
8-
if abs(grid[i][j] - base) % x != 0:
4+
mod = grid[0][0] % x
5+
for row in grid:
6+
for v in row:
7+
if v % x != mod:
98
return -1
10-
nums.append(grid[i][j])
9+
nums.append(v)
1110
nums.sort()
1211
mid = nums[len(nums) >> 1]
13-
ans = 0
14-
for num in nums:
15-
ans += abs(num - mid) // x
16-
return ans
12+
return sum(abs(v - mid) // x for v in nums)

0 commit comments

Comments
 (0)