Skip to content

Commit b95ccf3

Browse files
authored
feat: add solutions to lc problem: No.3107 (#2551)
1 parent 05da8f0 commit b95ccf3

File tree

7 files changed

+303
-8
lines changed

7 files changed

+303
-8
lines changed

solution/3100-3199/3107.Minimum Operations to Make Median of Array Equal to K/README.md

+105-4
Original file line numberDiff line numberDiff line change
@@ -60,24 +60,125 @@
6060

6161
## 解法
6262

63-
### 方法一
63+
### 方法一:贪心 + 排序
64+
65+
我们首先对数组 $nums$ 进行排序,然后找到中位数的位置 $m$,那么初始时我们需要的操作次数就是 $|nums[m] - k|$。
66+
67+
接下来,我们分情况讨论:
68+
69+
- 如果 $nums[m] \gt k$,那么 $m$ 右侧的元素都大于等于 $k$,我们只需要将 $m$ 左侧的元素中,大于 $k$ 的元素减小到 $k$ 即可。
70+
- 如果 $nums[m] \le k$,那么 $m$ 左侧的元素都小于等于 $k$,我们只需要将 $m$ 右侧的元素中,小于 $k$ 的元素增大到 $k$ 即可。
71+
72+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 是数组 $nums$ 的长度。
6473

6574
<!-- tabs:start -->
6675

6776
```python
68-
77+
class Solution:
78+
def minOperationsToMakeMedianK(self, nums: List[int], k: int) -> int:
79+
nums.sort()
80+
n = len(nums)
81+
m = n >> 1
82+
ans = abs(nums[m] - k)
83+
if nums[m] > k:
84+
for i in range(m - 1, -1, -1):
85+
if nums[i] <= k:
86+
break
87+
ans += nums[i] - k
88+
else:
89+
for i in range(m + 1, n):
90+
if nums[i] >= k:
91+
break
92+
ans += k - nums[i]
93+
return ans
6994
```
7095

7196
```java
72-
97+
class Solution {
98+
public long minOperationsToMakeMedianK(int[] nums, int k) {
99+
Arrays.sort(nums);
100+
int n = nums.length;
101+
int m = n >> 1;
102+
long ans = Math.abs(nums[m] - k);
103+
if (nums[m] > k) {
104+
for (int i = m - 1; i >= 0 && nums[i] > k; --i) {
105+
ans += nums[i] - k;
106+
}
107+
} else {
108+
for (int i = m + 1; i < n && nums[i] < k; ++i) {
109+
ans += k - nums[i];
110+
}
111+
}
112+
return ans;
113+
}
114+
}
73115
```
74116

75117
```cpp
76-
118+
class Solution {
119+
public:
120+
long long minOperationsToMakeMedianK(vector<int>& nums, int k) {
121+
sort(nums.begin(), nums.end());
122+
int n = nums.size();
123+
int m = n >> 1;
124+
long long ans = abs(nums[m] - k);
125+
if (nums[m] > k) {
126+
for (int i = m - 1; i >= 0 && nums[i] > k; --i) {
127+
ans += nums[i] - k;
128+
}
129+
} else {
130+
for (int i = m + 1; i < n && nums[i] < k; ++i) {
131+
ans += k - nums[i];
132+
}
133+
}
134+
return ans;
135+
}
136+
};
77137
```
78138
79139
```go
140+
func minOperationsToMakeMedianK(nums []int, k int) (ans int64) {
141+
sort.Ints(nums)
142+
n := len(nums)
143+
m := n >> 1
144+
ans = int64(abs(nums[m] - k))
145+
if nums[m] > k {
146+
for i := m - 1; i >= 0 && nums[i] > k; i-- {
147+
ans += int64(nums[i] - k)
148+
}
149+
} else {
150+
for i := m + 1; i < n && nums[i] < k; i++ {
151+
ans += int64(k - nums[i])
152+
}
153+
}
154+
return
155+
}
156+
157+
func abs(x int) int {
158+
if x < 0 {
159+
return -x
160+
}
161+
return x
162+
}
163+
```
80164

165+
```ts
166+
function minOperationsToMakeMedianK(nums: number[], k: number): number {
167+
nums.sort((a, b) => a - b);
168+
const n = nums.length;
169+
const m = n >> 1;
170+
let ans = Math.abs(nums[m] - k);
171+
if (nums[m] > k) {
172+
for (let i = m - 1; i >= 0 && nums[i] > k; --i) {
173+
ans += nums[i] - k;
174+
}
175+
} else {
176+
for (let i = m + 1; i < n && nums[i] < k; ++i) {
177+
ans += k - nums[i];
178+
}
179+
}
180+
return ans;
181+
}
81182
```
82183

83184
<!-- tabs:end -->

solution/3100-3199/3107.Minimum Operations to Make Median of Array Equal to K/README_EN.md

+105-4
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,125 @@
5858

5959
## Solutions
6060

61-
### Solution 1
61+
### Solution 1: Greedy + Sorting
62+
63+
First, we sort the array $nums$ and find the position $m$ of the median. The initial number of operations we need is $|nums[m] - k|$.
64+
65+
Next, we discuss in two cases:
66+
67+
- If $nums[m] > k$, then all elements to the right of $m$ are greater than or equal to $k$. We only need to reduce the elements greater than $k$ on the left of $m$ to $k$.
68+
- If $nums[m] \le k$, then all elements to the left of $m$ are less than or equal to $k$. We only need to increase the elements less than $k$ on the right of $m$ to $k$.
69+
70+
The time complexity is $O(n \times \log n)$, and the space complexity is $O(\log n)$. Here, $n$ is the length of the array $nums$.
6271

6372
<!-- tabs:start -->
6473

6574
```python
66-
75+
class Solution:
76+
def minOperationsToMakeMedianK(self, nums: List[int], k: int) -> int:
77+
nums.sort()
78+
n = len(nums)
79+
m = n >> 1
80+
ans = abs(nums[m] - k)
81+
if nums[m] > k:
82+
for i in range(m - 1, -1, -1):
83+
if nums[i] <= k:
84+
break
85+
ans += nums[i] - k
86+
else:
87+
for i in range(m + 1, n):
88+
if nums[i] >= k:
89+
break
90+
ans += k - nums[i]
91+
return ans
6792
```
6893

6994
```java
70-
95+
class Solution {
96+
public long minOperationsToMakeMedianK(int[] nums, int k) {
97+
Arrays.sort(nums);
98+
int n = nums.length;
99+
int m = n >> 1;
100+
long ans = Math.abs(nums[m] - k);
101+
if (nums[m] > k) {
102+
for (int i = m - 1; i >= 0 && nums[i] > k; --i) {
103+
ans += nums[i] - k;
104+
}
105+
} else {
106+
for (int i = m + 1; i < n && nums[i] < k; ++i) {
107+
ans += k - nums[i];
108+
}
109+
}
110+
return ans;
111+
}
112+
}
71113
```
72114

73115
```cpp
74-
116+
class Solution {
117+
public:
118+
long long minOperationsToMakeMedianK(vector<int>& nums, int k) {
119+
sort(nums.begin(), nums.end());
120+
int n = nums.size();
121+
int m = n >> 1;
122+
long long ans = abs(nums[m] - k);
123+
if (nums[m] > k) {
124+
for (int i = m - 1; i >= 0 && nums[i] > k; --i) {
125+
ans += nums[i] - k;
126+
}
127+
} else {
128+
for (int i = m + 1; i < n && nums[i] < k; ++i) {
129+
ans += k - nums[i];
130+
}
131+
}
132+
return ans;
133+
}
134+
};
75135
```
76136
77137
```go
138+
func minOperationsToMakeMedianK(nums []int, k int) (ans int64) {
139+
sort.Ints(nums)
140+
n := len(nums)
141+
m := n >> 1
142+
ans = int64(abs(nums[m] - k))
143+
if nums[m] > k {
144+
for i := m - 1; i >= 0 && nums[i] > k; i-- {
145+
ans += int64(nums[i] - k)
146+
}
147+
} else {
148+
for i := m + 1; i < n && nums[i] < k; i++ {
149+
ans += int64(k - nums[i])
150+
}
151+
}
152+
return
153+
}
154+
155+
func abs(x int) int {
156+
if x < 0 {
157+
return -x
158+
}
159+
return x
160+
}
161+
```
78162

163+
```ts
164+
function minOperationsToMakeMedianK(nums: number[], k: number): number {
165+
nums.sort((a, b) => a - b);
166+
const n = nums.length;
167+
const m = n >> 1;
168+
let ans = Math.abs(nums[m] - k);
169+
if (nums[m] > k) {
170+
for (let i = m - 1; i >= 0 && nums[i] > k; --i) {
171+
ans += nums[i] - k;
172+
}
173+
} else {
174+
for (let i = m + 1; i < n && nums[i] < k; ++i) {
175+
ans += k - nums[i];
176+
}
177+
}
178+
return ans;
179+
}
79180
```
80181

81182
<!-- tabs:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
long long minOperationsToMakeMedianK(vector<int>& nums, int k) {
4+
sort(nums.begin(), nums.end());
5+
int n = nums.size();
6+
int m = n >> 1;
7+
long long ans = abs(nums[m] - k);
8+
if (nums[m] > k) {
9+
for (int i = m - 1; i >= 0 && nums[i] > k; --i) {
10+
ans += nums[i] - k;
11+
}
12+
} else {
13+
for (int i = m + 1; i < n && nums[i] < k; ++i) {
14+
ans += k - nums[i];
15+
}
16+
}
17+
return ans;
18+
}
19+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func minOperationsToMakeMedianK(nums []int, k int) (ans int64) {
2+
sort.Ints(nums)
3+
n := len(nums)
4+
m := n >> 1
5+
ans = int64(abs(nums[m] - k))
6+
if nums[m] > k {
7+
for i := m - 1; i >= 0 && nums[i] > k; i-- {
8+
ans += int64(nums[i] - k)
9+
}
10+
} else {
11+
for i := m + 1; i < n && nums[i] < k; i++ {
12+
ans += int64(k - nums[i])
13+
}
14+
}
15+
return
16+
}
17+
18+
func abs(x int) int {
19+
if x < 0 {
20+
return -x
21+
}
22+
return x
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public long minOperationsToMakeMedianK(int[] nums, int k) {
3+
Arrays.sort(nums);
4+
int n = nums.length;
5+
int m = n >> 1;
6+
long ans = Math.abs(nums[m] - k);
7+
if (nums[m] > k) {
8+
for (int i = m - 1; i >= 0 && nums[i] > k; --i) {
9+
ans += nums[i] - k;
10+
}
11+
} else {
12+
for (int i = m + 1; i < n && nums[i] < k; ++i) {
13+
ans += k - nums[i];
14+
}
15+
}
16+
return ans;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def minOperationsToMakeMedianK(self, nums: List[int], k: int) -> int:
3+
nums.sort()
4+
n = len(nums)
5+
m = n >> 1
6+
ans = abs(nums[m] - k)
7+
if nums[m] > k:
8+
for i in range(m - 1, -1, -1):
9+
if nums[i] <= k:
10+
break
11+
ans += nums[i] - k
12+
else:
13+
for i in range(m + 1, n):
14+
if nums[i] >= k:
15+
break
16+
ans += k - nums[i]
17+
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
function minOperationsToMakeMedianK(nums: number[], k: number): number {
2+
nums.sort((a, b) => a - b);
3+
const n = nums.length;
4+
const m = n >> 1;
5+
let ans = Math.abs(nums[m] - k);
6+
if (nums[m] > k) {
7+
for (let i = m - 1; i >= 0 && nums[i] > k; --i) {
8+
ans += nums[i] - k;
9+
}
10+
} else {
11+
for (let i = m + 1; i < n && nums[i] < k; ++i) {
12+
ans += k - nums[i];
13+
}
14+
}
15+
return ans;
16+
}

0 commit comments

Comments
 (0)