Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b95ccf3

Browse files
feat: add solutions to lc problem: No.3107 (doocs#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‎

Lines changed: 105 additions & 4 deletions
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‎

Lines changed: 105 additions & 4 deletions
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 -->
Lines changed: 19 additions & 0 deletions
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+
};
Lines changed: 23 additions & 0 deletions
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+
}
Lines changed: 18 additions & 0 deletions
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+
}
Lines changed: 17 additions & 0 deletions
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
Lines changed: 16 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /