Skip to content

Commit 9b16d42

Browse files
committed
feat: add solutions to lc problem: No.2366
No.2366.Minimum Replacements to Sort the Array
1 parent b77b37b commit 9b16d42

File tree

7 files changed

+133
-89
lines changed

7 files changed

+133
-89
lines changed

solution/2300-2399/2366.Minimum Replacements to Sort the Array/README.md

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:贪心**
52+
53+
我们观察发现,要使得数组 $nums$ 变成非递减有序,也即单调递增,那么数组后面的元素应该尽可能大,所以,将数组 $nums$ 的最后一个元素 $nums[n-1]$ 替换成多个更小的数是没有必要的。
54+
55+
也即是说,我们可以从后往前遍历数组 $nums$,并且维护当前的最大值 $mx$,初始时 $mx = nums[n-1]$。
56+
57+
- 若当前遍历到的元素 $nums[i] \leq mx$,此时不需要将 $nums[i]$ 进行替换,我们直接更新 $mx = nums[i]$ 即可。
58+
- 否则,我们需要将 $nums[i]$ 替换成多个和为 $nums[i]$ 的数,这些数的最大值为 $mx$,总共替换成 $k=\left \lceil \frac{nums[i]}{mx} \right \rceil $ 个数,所以需要进行 $k-1$ 次操作,累加到答案中。这 $k$ 个数中,最小的数为 $\left \lfloor \frac{nums[i]}{k} \right \rfloor$,因此,我们更新 $mx = \left \lfloor \frac{nums[i]}{k} \right \rfloor$。
59+
60+
遍历结束,返回总的操作次数即可。
61+
62+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。
63+
5164
<!-- tabs:start -->
5265

5366
### **Python3**
@@ -57,16 +70,16 @@
5770
```python
5871
class Solution:
5972
def minimumReplacement(self, nums: List[int]) -> int:
60-
ans, n = 0, len(nums)
61-
mi = nums[-1]
73+
ans = 0
74+
n = len(nums)
75+
mx = nums[-1]
6276
for i in range(n - 2, -1, -1):
63-
v = nums[i]
64-
if v <= mi:
65-
mi = v
77+
if nums[i] <= mx:
78+
mx = nums[i]
6679
continue
67-
k = (v + mi - 1) // mi
80+
k = (nums[i] + mx - 1) // mx
6881
ans += k - 1
69-
mi = v // k
82+
mx = nums[i] // k
7083
return ans
7184
```
7285

@@ -79,16 +92,15 @@ class Solution {
7992
public long minimumReplacement(int[] nums) {
8093
long ans = 0;
8194
int n = nums.length;
82-
int mi = nums[n - 1];
95+
int mx = nums[n - 1];
8396
for (int i = n - 2; i >= 0; --i) {
84-
int v = nums[i];
85-
if (v <= mi) {
86-
mi = v;
97+
if (nums[i] <= mx) {
98+
mx = nums[i];
8799
continue;
88100
}
89-
int k = (v + mi - 1) / mi;
101+
int k = (nums[i] + mx - 1) / mx;
90102
ans += k - 1;
91-
mi = v / k;
103+
mx = nums[i] / k;
92104
}
93105
return ans;
94106
}
@@ -103,16 +115,15 @@ public:
103115
long long minimumReplacement(vector<int>& nums) {
104116
long long ans = 0;
105117
int n = nums.size();
106-
int mi = nums[n - 1];
107-
for (int i = n - 2; ~i; --i) {
108-
int v = nums[i];
109-
if (v <= mi) {
110-
mi = v;
118+
int mx = nums[n - 1];
119+
for (int i = n - 2; i >= 0; --i) {
120+
if (nums[i] <= mx) {
121+
mx = nums[i];
111122
continue;
112123
}
113-
int k = (v + mi - 1) / mi;
124+
int k = (nums[i] + mx - 1) / mx;
114125
ans += k - 1;
115-
mi = v / k;
126+
mx = nums[i] / k;
116127
}
117128
return ans;
118129
}
@@ -122,28 +133,40 @@ public:
122133
### **Go**
123134
124135
```go
125-
func minimumReplacement(nums []int) int64 {
126-
var ans int64
136+
func minimumReplacement(nums []int) (ans int64) {
127137
n := len(nums)
128-
mi := nums[n-1]
138+
mx := nums[n-1]
129139
for i := n - 2; i >= 0; i-- {
130-
v := nums[i]
131-
if v <= mi {
132-
mi = v
140+
if nums[i] <= mx {
141+
mx = nums[i]
133142
continue
134143
}
135-
k := (v + mi - 1) / mi
144+
k := (nums[i] + mx - 1) / mx
136145
ans += int64(k - 1)
137-
mi = v / k
146+
mx = nums[i] / k
138147
}
139-
return ans
148+
return
140149
}
141150
```
142151

143152
### **TypeScript**
144153

145154
```ts
146-
155+
function minimumReplacement(nums: number[]): number {
156+
const n = nums.length;
157+
let mx = nums[n - 1];
158+
let ans = 0;
159+
for (let i = n - 2; i >= 0; --i) {
160+
if (nums[i] <= mx) {
161+
mx = nums[i];
162+
continue;
163+
}
164+
const k = Math.ceil(nums[i] / mx);
165+
ans += k - 1;
166+
mx = Math.floor(nums[i] / k);
167+
}
168+
return ans;
169+
}
147170
```
148171

149172
### **...**

solution/2300-2399/2366.Minimum Replacements to Sort the Array/README_EN.md

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,16 @@ There are 2 steps to sort the array in non-decreasing order. Therefore, we retur
5050
```python
5151
class Solution:
5252
def minimumReplacement(self, nums: List[int]) -> int:
53-
ans, n = 0, len(nums)
54-
mi = nums[-1]
53+
ans = 0
54+
n = len(nums)
55+
mx = nums[-1]
5556
for i in range(n - 2, -1, -1):
56-
v = nums[i]
57-
if v <= mi:
58-
mi = v
57+
if nums[i] <= mx:
58+
mx = nums[i]
5959
continue
60-
k = (v + mi - 1) // mi
60+
k = (nums[i] + mx - 1) // mx
6161
ans += k - 1
62-
mi = v // k
62+
mx = nums[i] // k
6363
return ans
6464
```
6565

@@ -70,16 +70,15 @@ class Solution {
7070
public long minimumReplacement(int[] nums) {
7171
long ans = 0;
7272
int n = nums.length;
73-
int mi = nums[n - 1];
73+
int mx = nums[n - 1];
7474
for (int i = n - 2; i >= 0; --i) {
75-
int v = nums[i];
76-
if (v <= mi) {
77-
mi = v;
75+
if (nums[i] <= mx) {
76+
mx = nums[i];
7877
continue;
7978
}
80-
int k = (v + mi - 1) / mi;
79+
int k = (nums[i] + mx - 1) / mx;
8180
ans += k - 1;
82-
mi = v / k;
81+
mx = nums[i] / k;
8382
}
8483
return ans;
8584
}
@@ -94,16 +93,15 @@ public:
9493
long long minimumReplacement(vector<int>& nums) {
9594
long long ans = 0;
9695
int n = nums.size();
97-
int mi = nums[n - 1];
98-
for (int i = n - 2; ~i; --i) {
99-
int v = nums[i];
100-
if (v <= mi) {
101-
mi = v;
96+
int mx = nums[n - 1];
97+
for (int i = n - 2; i >= 0; --i) {
98+
if (nums[i] <= mx) {
99+
mx = nums[i];
102100
continue;
103101
}
104-
int k = (v + mi - 1) / mi;
102+
int k = (nums[i] + mx - 1) / mx;
105103
ans += k - 1;
106-
mi = v / k;
104+
mx = nums[i] / k;
107105
}
108106
return ans;
109107
}
@@ -113,28 +111,40 @@ public:
113111
### **Go**
114112
115113
```go
116-
func minimumReplacement(nums []int) int64 {
117-
var ans int64
114+
func minimumReplacement(nums []int) (ans int64) {
118115
n := len(nums)
119-
mi := nums[n-1]
116+
mx := nums[n-1]
120117
for i := n - 2; i >= 0; i-- {
121-
v := nums[i]
122-
if v <= mi {
123-
mi = v
118+
if nums[i] <= mx {
119+
mx = nums[i]
124120
continue
125121
}
126-
k := (v + mi - 1) / mi
122+
k := (nums[i] + mx - 1) / mx
127123
ans += int64(k - 1)
128-
mi = v / k
124+
mx = nums[i] / k
129125
}
130-
return ans
126+
return
131127
}
132128
```
133129

134130
### **TypeScript**
135131

136132
```ts
137-
133+
function minimumReplacement(nums: number[]): number {
134+
const n = nums.length;
135+
let mx = nums[n - 1];
136+
let ans = 0;
137+
for (let i = n - 2; i >= 0; --i) {
138+
if (nums[i] <= mx) {
139+
mx = nums[i];
140+
continue;
141+
}
142+
const k = Math.ceil(nums[i] / mx);
143+
ans += k - 1;
144+
mx = Math.floor(nums[i] / k);
145+
}
146+
return ans;
147+
}
138148
```
139149

140150
### **...**

solution/2300-2399/2366.Minimum Replacements to Sort the Array/Solution.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ class Solution {
33
long long minimumReplacement(vector<int>& nums) {
44
long long ans = 0;
55
int n = nums.size();
6-
int mi = nums[n - 1];
7-
for (int i = n - 2; ~i; --i) {
8-
int v = nums[i];
9-
if (v <= mi) {
10-
mi = v;
6+
int mx = nums[n - 1];
7+
for (int i = n - 2; i >= 0; --i) {
8+
if (nums[i] <= mx) {
9+
mx = nums[i];
1110
continue;
1211
}
13-
int k = (v + mi - 1) / mi;
12+
int k = (nums[i] + mx - 1) / mx;
1413
ans += k - 1;
15-
mi = v / k;
14+
mx = nums[i] / k;
1615
}
1716
return ans;
1817
}
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
func minimumReplacement(nums []int) int64 {
2-
var ans int64
1+
func minimumReplacement(nums []int) (ans int64) {
32
n := len(nums)
4-
mi := nums[n-1]
3+
mx := nums[n-1]
54
for i := n - 2; i >= 0; i-- {
6-
v := nums[i]
7-
if v <= mi {
8-
mi = v
5+
if nums[i] <= mx {
6+
mx = nums[i]
97
continue
108
}
11-
k := (v + mi - 1) / mi
9+
k := (nums[i] + mx - 1) / mx
1210
ans += int64(k - 1)
13-
mi = v / k
11+
mx = nums[i] / k
1412
}
15-
return ans
13+
return
1614
}

solution/2300-2399/2366.Minimum Replacements to Sort the Array/Solution.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ class Solution {
22
public long minimumReplacement(int[] nums) {
33
long ans = 0;
44
int n = nums.length;
5-
int mi = nums[n - 1];
5+
int mx = nums[n - 1];
66
for (int i = n - 2; i >= 0; --i) {
7-
int v = nums[i];
8-
if (v <= mi) {
9-
mi = v;
7+
if (nums[i] <= mx) {
8+
mx = nums[i];
109
continue;
1110
}
12-
int k = (v + mi - 1) / mi;
11+
int k = (nums[i] + mx - 1) / mx;
1312
ans += k - 1;
14-
mi = v / k;
13+
mx = nums[i] / k;
1514
}
1615
return ans;
1716
}
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
class Solution:
22
def minimumReplacement(self, nums: List[int]) -> int:
3-
ans, n = 0, len(nums)
4-
mi = nums[-1]
3+
ans = 0
4+
n = len(nums)
5+
mx = nums[-1]
56
for i in range(n - 2, -1, -1):
6-
v = nums[i]
7-
if v <= mi:
8-
mi = v
7+
if nums[i] <= mx:
8+
mx = nums[i]
99
continue
10-
k = (v + mi - 1) // mi
10+
k = (nums[i] + mx - 1) // mx
1111
ans += k - 1
12-
mi = v // k
12+
mx = nums[i] // k
1313
return ans
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
function minimumReplacement(nums: number[]): number {
2+
const n = nums.length;
3+
let mx = nums[n - 1];
4+
let ans = 0;
5+
for (let i = n - 2; i >= 0; --i) {
6+
if (nums[i] <= mx) {
7+
mx = nums[i];
8+
continue;
9+
}
10+
const k = Math.ceil(nums[i] / mx);
11+
ans += k - 1;
12+
mx = Math.floor(nums[i] / k);
13+
}
14+
return ans;
15+
}

0 commit comments

Comments
 (0)