Skip to content

Commit c0bb94f

Browse files
committed
feat: add solutions to lc problem: No.1675
No.1675.Minimize Deviation in Array
1 parent 436938a commit c0bb94f

File tree

6 files changed

+318
-2
lines changed

6 files changed

+318
-2
lines changed

solution/1600-1699/1675.Minimize Deviation in Array/README.md

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,138 @@
6363

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

66+
**方法一:贪心 + 优先队列**
67+
68+
直观上,为了得到数组的最小偏移量,我们需要将减小数组的最大值,增大数组的最小值。
69+
70+
由于每次可以执行乘、除两种操作:将奇数乘以 $2$;将偶数除以 $2$,情况较为复杂,我们可以将奇数统一乘以 $2$,转成偶数,这样就等价于只有一种除法操作。除法操作只能减少某个数,而只有减少最大值,结果才可能更优。
71+
72+
因此,我们用优先队列(大根堆)维护数组的最大值,每次取出堆顶元素做除法操作,将新值放入堆中,并且更新最小值以及堆顶元素与最小值的差值的最小值。
73+
74+
当堆顶元素为奇数时,操作停止。
75+
76+
时间复杂度 $O(n\log n \times \log m)$。其中 $n$, $m$ 分别是数组 `nums` 的长度以及数组的最大元素。由于数组中的最大元素除以 $2$ 的操作最多有 $O(\log m)$ 次,因此全部元素除以 $2$ 的操作最多有 $O(n\log m)$ 次。每次弹出、放入堆的操作,时间复杂度为 $O(\log n)$。因此,总的时间复杂度为 $O(n\log n \times \log m)$。
77+
6678
<!-- tabs:start -->
6779

6880
### **Python3**
6981

7082
<!-- 这里可写当前语言的特殊实现逻辑 -->
7183

7284
```python
73-
85+
class Solution:
86+
def minimumDeviation(self, nums: List[int]) -> int:
87+
h = []
88+
mi = inf
89+
for v in nums:
90+
if v & 1:
91+
v <<= 1
92+
h.append(-v)
93+
mi = min(mi, v)
94+
heapify(h)
95+
ans = -h[0] - mi
96+
while h[0] % 2 == 0:
97+
x = heappop(h) // 2
98+
heappush(h, x)
99+
mi = min(mi, -x)
100+
ans = min(ans, -h[0] - mi)
101+
return ans
74102
```
75103

76104
### **Java**
77105

78106
<!-- 这里可写当前语言的特殊实现逻辑 -->
79107

80108
```java
109+
class Solution {
110+
public int minimumDeviation(int[] nums) {
111+
PriorityQueue<Integer> q = new PriorityQueue<>((a, b) -> b - a);
112+
int mi = Integer.MAX_VALUE;
113+
for (int v : nums) {
114+
if (v % 2 == 1) {
115+
v <<= 1;
116+
}
117+
q.offer(v);
118+
mi = Math.min(mi, v);
119+
}
120+
int ans = q.peek() - mi;
121+
while (q.peek() % 2 == 0) {
122+
int x = q.poll() / 2;
123+
q.offer(x);
124+
mi = Math.min(mi, x);
125+
ans = Math.min(ans, q.peek() - mi);
126+
}
127+
return ans;
128+
}
129+
}
130+
```
131+
132+
### **C++**
133+
134+
```cpp
135+
class Solution {
136+
public:
137+
int minimumDeviation(vector<int>& nums) {
138+
int mi = INT_MAX;
139+
priority_queue<int> pq;
140+
for (int v : nums) {
141+
if (v & 1) v <<= 1;
142+
pq.push(v);
143+
mi = min(mi, v);
144+
}
145+
int ans = pq.top() - mi;
146+
while (pq.top() % 2 == 0) {
147+
int x = pq.top() >> 1;
148+
pq.pop();
149+
pq.push(x);
150+
mi = min(mi, x);
151+
ans = min(ans, pq.top() - mi);
152+
}
153+
return ans;
154+
}
155+
};
156+
```
81157
158+
### **Go**
159+
160+
```go
161+
func minimumDeviation(nums []int) int {
162+
q := hp{}
163+
mi := math.MaxInt32
164+
for _, v := range nums {
165+
if v%2 == 1 {
166+
v <<= 1
167+
}
168+
heap.Push(&q, v)
169+
mi = min(mi, v)
170+
}
171+
ans := q.IntSlice[0] - mi
172+
for q.IntSlice[0]%2 == 0 {
173+
x := heap.Pop(&q).(int) >> 1
174+
heap.Push(&q, x)
175+
mi = min(mi, x)
176+
ans = min(ans, q.IntSlice[0]-mi)
177+
}
178+
return ans
179+
}
180+
181+
func min(a, b int) int {
182+
if a < b {
183+
return a
184+
}
185+
return b
186+
}
187+
188+
type hp struct{ sort.IntSlice }
189+
190+
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
191+
func (h *hp) Pop() interface{} {
192+
a := h.IntSlice
193+
v := a[len(a)-1]
194+
h.IntSlice = a[:len(a)-1]
195+
return v
196+
}
197+
func (h *hp) Less(i, j int) bool { return h.IntSlice[i] > h.IntSlice[j] }
82198
```
83199

84200
### **...**

solution/1600-1699/1675.Minimize Deviation in Array/README_EN.md

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,117 @@
6565
### **Python3**
6666

6767
```python
68-
68+
class Solution:
69+
def minimumDeviation(self, nums: List[int]) -> int:
70+
h = []
71+
mi = inf
72+
for v in nums:
73+
if v & 1:
74+
v <<= 1
75+
h.append(-v)
76+
mi = min(mi, v)
77+
heapify(h)
78+
ans = -h[0] - mi
79+
while h[0] % 2 == 0:
80+
x = heappop(h) // 2
81+
heappush(h, x)
82+
mi = min(mi, -x)
83+
ans = min(ans, -h[0] - mi)
84+
return ans
6985
```
7086

7187
### **Java**
7288

7389
```java
90+
class Solution {
91+
public int minimumDeviation(int[] nums) {
92+
PriorityQueue<Integer> q = new PriorityQueue<>((a, b) -> b - a);
93+
int mi = Integer.MAX_VALUE;
94+
for (int v : nums) {
95+
if (v % 2 == 1) {
96+
v <<= 1;
97+
}
98+
q.offer(v);
99+
mi = Math.min(mi, v);
100+
}
101+
int ans = q.peek() - mi;
102+
while (q.peek() % 2 == 0) {
103+
int x = q.poll() / 2;
104+
q.offer(x);
105+
mi = Math.min(mi, x);
106+
ans = Math.min(ans, q.peek() - mi);
107+
}
108+
return ans;
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
int minimumDeviation(vector<int>& nums) {
119+
int mi = INT_MAX;
120+
priority_queue<int> pq;
121+
for (int v : nums) {
122+
if (v & 1) v <<= 1;
123+
pq.push(v);
124+
mi = min(mi, v);
125+
}
126+
int ans = pq.top() - mi;
127+
while (pq.top() % 2 == 0) {
128+
int x = pq.top() >> 1;
129+
pq.pop();
130+
pq.push(x);
131+
mi = min(mi, x);
132+
ans = min(ans, pq.top() - mi);
133+
}
134+
return ans;
135+
}
136+
};
137+
```
74138
139+
### **Go**
140+
141+
```go
142+
func minimumDeviation(nums []int) int {
143+
q := hp{}
144+
mi := math.MaxInt32
145+
for _, v := range nums {
146+
if v%2 == 1 {
147+
v <<= 1
148+
}
149+
heap.Push(&q, v)
150+
mi = min(mi, v)
151+
}
152+
ans := q.IntSlice[0] - mi
153+
for q.IntSlice[0]%2 == 0 {
154+
x := heap.Pop(&q).(int) >> 1
155+
heap.Push(&q, x)
156+
mi = min(mi, x)
157+
ans = min(ans, q.IntSlice[0]-mi)
158+
}
159+
return ans
160+
}
161+
162+
func min(a, b int) int {
163+
if a < b {
164+
return a
165+
}
166+
return b
167+
}
168+
169+
type hp struct{ sort.IntSlice }
170+
171+
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
172+
func (h *hp) Pop() interface{} {
173+
a := h.IntSlice
174+
v := a[len(a)-1]
175+
h.IntSlice = a[:len(a)-1]
176+
return v
177+
}
178+
func (h *hp) Less(i, j int) bool { return h.IntSlice[i] > h.IntSlice[j] }
75179
```
76180

77181
### **...**
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
int minimumDeviation(vector<int>& nums) {
4+
int mi = INT_MAX;
5+
priority_queue<int> pq;
6+
for (int v : nums) {
7+
if (v & 1) v <<= 1;
8+
pq.push(v);
9+
mi = min(mi, v);
10+
}
11+
int ans = pq.top() - mi;
12+
while (pq.top() % 2 == 0) {
13+
int x = pq.top() >> 1;
14+
pq.pop();
15+
pq.push(x);
16+
mi = min(mi, x);
17+
ans = min(ans, pq.top() - mi);
18+
}
19+
return ans;
20+
}
21+
};
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
func minimumDeviation(nums []int) int {
2+
q := hp{}
3+
mi := math.MaxInt32
4+
for _, v := range nums {
5+
if v%2 == 1 {
6+
v <<= 1
7+
}
8+
heap.Push(&q, v)
9+
mi = min(mi, v)
10+
}
11+
ans := q.IntSlice[0] - mi
12+
for q.IntSlice[0]%2 == 0 {
13+
x := heap.Pop(&q).(int) >> 1
14+
heap.Push(&q, x)
15+
mi = min(mi, x)
16+
ans = min(ans, q.IntSlice[0]-mi)
17+
}
18+
return ans
19+
}
20+
21+
func min(a, b int) int {
22+
if a < b {
23+
return a
24+
}
25+
return b
26+
}
27+
28+
type hp struct{ sort.IntSlice }
29+
30+
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
31+
func (h *hp) Pop() interface{} {
32+
a := h.IntSlice
33+
v := a[len(a)-1]
34+
h.IntSlice = a[:len(a)-1]
35+
return v
36+
}
37+
func (h *hp) Less(i, j int) bool { return h.IntSlice[i] > h.IntSlice[j] }
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public int minimumDeviation(int[] nums) {
3+
PriorityQueue<Integer> q = new PriorityQueue<>((a, b) -> b - a);
4+
int mi = Integer.MAX_VALUE;
5+
for (int v : nums) {
6+
if (v % 2 == 1) {
7+
v <<= 1;
8+
}
9+
q.offer(v);
10+
mi = Math.min(mi, v);
11+
}
12+
int ans = q.peek() - mi;
13+
while (q.peek() % 2 == 0) {
14+
int x = q.poll() / 2;
15+
q.offer(x);
16+
mi = Math.min(mi, x);
17+
ans = Math.min(ans, q.peek() - mi);
18+
}
19+
return ans;
20+
}
21+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def minimumDeviation(self, nums: List[int]) -> int:
3+
h = []
4+
mi = inf
5+
for v in nums:
6+
if v & 1:
7+
v <<= 1
8+
h.append(-v)
9+
mi = min(mi, v)
10+
heapify(h)
11+
ans = -h[0] - mi
12+
while h[0] % 2 == 0:
13+
x = heappop(h) // 2
14+
heappush(h, x)
15+
mi = min(mi, -x)
16+
ans = min(ans, -h[0] - mi)
17+
return ans

0 commit comments

Comments
 (0)