Skip to content

Commit dffba15

Browse files
committed
feat: add solutions to lc problem: No.1187
No.1187.Make Array Strictly Increasing
1 parent 0232939 commit dffba15

File tree

7 files changed

+427
-6
lines changed

7 files changed

+427
-6
lines changed

solution/0800-0899/0879.Profitable Schemes/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555

5656
**方法一:动态规划**
5757

58-
我们定义 $f[i][j][k]$ 表示前 $i$ 个工作中,选择了 $j$ 个员工,且至少产生 $k$ 的利润的方案数。初始时 $f[0][j][0] = 1$,表示不选择任何工作,且至少产生 $0$ 的利润的方案数为 $1$。答案即为 $f[m][n][minProfit]$。
58+
我们定义 $f[i][j][k]$ 表示前 $i$ 个工作中,选择了不超过 $j$ 个员工,且至少产生 $k$ 的利润的方案数。初始时 $f[0][j][0] = 1$,表示不选择任何工作,且至少产生 $0$ 的利润的方案数为 $1$。答案即为 $f[m][n][minProfit]$。
5959

6060
对于第 $i$ 个工作,我们可以选择参与或不参与。如果不参与,则 $f[i][j][k] = f[i - 1][j][k]$;如果参与,则 $f[i][j][k] = f[i - 1][j - group[i - 1]][max(0, k - profit[i - 1])]$。我们需要枚举 $j$ 和 $k$,并将所有的方案数相加。
6161

solution/1100-1199/1187.Make Array Strictly Increasing/README.md

Lines changed: 153 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,174 @@
4949

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

52+
**方法一:动态规划**
53+
54+
我们定义 $f[i]$ 表示将 $arr1[0,..,i]$ 转换为严格递增数组,且 $arr1[i]$ 不替换的最小操作数。因此,我们在 $arr1$ 设置首尾两个哨兵 $-\infty$ 和 $\infty$。最后一个数一定是不替换,因此 $f[n-1]$ 即为答案。我们初始化 $f[0]=0$,其余 $f[i]=\infty$。
55+
56+
接下来我们对数组 $arr2$ 进行排序并去重,方便进行二分查找。
57+
58+
对于 $i=1,..,n-1$,我们考虑 $arr1[i-1]$ 是否替换。如果 $arr1[i-1] \lt arr1[i]$,那么 $f[i]$ 可以从 $f[i-1]$ 转移而来,即 $f[i] = f[i-1]$。然后,我们考虑 $arr[i-1]$ 替换的情况,显然 $arr[i-1]$ 应该替换成一个尽可能大的、且比 $arr[i]$ 小的数字,我们在数组 $arr2$ 中进行二分查找,找到第一个大于等于 $arr[i]$ 的下标 $j$。然后我们在 $k \in [1, min(i-1, j)]$ 的范围内枚举替换的个数,如果满足 $arr[i-k-1] \lt arr2[j-k]$,那么 $f[i]$ 可以从 $f[i-k-1]$ 转移而来,即 $f[i] = min(f[i], f[i-k-1] + k)$。
59+
60+
最后,如果 $f[n-1] \geq \infty$,说明无法转换为严格递增数组,返回 $-1$,否则返回 $f[n-1]$。
61+
62+
时间复杂度 $(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为 $arr1$ 的长度。
63+
5264
<!-- tabs:start -->
5365

5466
### **Python3**
5567

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

5870
```python
59-
71+
class Solution:
72+
def makeArrayIncreasing(self, arr1: List[int], arr2: List[int]) -> int:
73+
arr2.sort()
74+
m = 0
75+
for x in arr2:
76+
if m == 0 or x != arr2[m - 1]:
77+
arr2[m] = x
78+
m += 1
79+
arr2 = arr2[:m]
80+
arr = [-inf] + arr1 + [inf]
81+
n = len(arr)
82+
f = [inf] * n
83+
f[0] = 0
84+
for i in range(1, n):
85+
if arr[i - 1] < arr[i]:
86+
f[i] = f[i - 1]
87+
j = bisect_left(arr2, arr[i])
88+
for k in range(1, min(i - 1, j) + 1):
89+
if arr[i - k - 1] < arr2[j - k]:
90+
f[i] = min(f[i], f[i - k - 1] + k)
91+
return -1 if f[n - 1] >= inf else f[n - 1]
6092
```
6193

6294
### **Java**
6395

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

6698
```java
99+
class Solution {
100+
public int makeArrayIncreasing(int[] arr1, int[] arr2) {
101+
Arrays.sort(arr2);
102+
int m = 0;
103+
for (int x : arr2) {
104+
if (m == 0 || x != arr2[m - 1]) {
105+
arr2[m++] = x;
106+
}
107+
}
108+
final int inf = 1 << 30;
109+
int[] arr = new int[arr1.length + 2];
110+
arr[0] = -inf;
111+
arr[arr.length - 1] = inf;
112+
System.arraycopy(arr1, 0, arr, 1, arr1.length);
113+
int[] f = new int[arr.length];
114+
Arrays.fill(f, inf);
115+
f[0] = 0;
116+
for (int i = 1; i < arr.length; ++i) {
117+
if (arr[i - 1] < arr[i]) {
118+
f[i] = f[i - 1];
119+
}
120+
int j = search(arr2, arr[i], m);
121+
for (int k = 1; k <= Math.min(i - 1, j); ++k) {
122+
if (arr[i - k - 1] < arr2[j - k]) {
123+
f[i] = Math.min(f[i], f[i - k - 1] + k);
124+
}
125+
}
126+
}
127+
return f[arr.length - 1] >= inf ? -1 : f[arr.length - 1];
128+
}
129+
130+
private int search(int[] nums, int x, int n) {
131+
int l = 0, r = n;
132+
while (l < r) {
133+
int mid = (l + r) >> 1;
134+
if (nums[mid] >= x) {
135+
r = mid;
136+
} else {
137+
l = mid + 1;
138+
}
139+
}
140+
return l;
141+
}
142+
}
143+
```
144+
145+
### **C++**
146+
147+
```cpp
148+
class Solution {
149+
public:
150+
int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2) {
151+
sort(arr2.begin(), arr2.end());
152+
arr2.erase(unique(arr2.begin(), arr2.end()), arr2.end());
153+
const int inf = 1 << 30;
154+
arr1.insert(arr1.begin(), -inf);
155+
arr1.push_back(inf);
156+
int n = arr1.size();
157+
vector<int> f(n, inf);
158+
f[0] = 0;
159+
for (int i = 1; i < n; ++i) {
160+
if (arr1[i - 1] < arr1[i]) {
161+
f[i] = f[i - 1];
162+
}
163+
int j = lower_bound(arr2.begin(), arr2.end(), arr1[i]) - arr2.begin();
164+
for (int k = 1; k <= min(i - 1, j); ++k) {
165+
if (arr1[i - k - 1] < arr2[j - k]) {
166+
f[i] = min(f[i], f[i - k - 1] + k);
167+
}
168+
}
169+
}
170+
return f[n - 1] >= inf ? -1 : f[n - 1];
171+
}
172+
};
173+
```
67174
175+
### **Go**
176+
177+
```go
178+
func makeArrayIncreasing(arr1 []int, arr2 []int) int {
179+
sort.Ints(arr2)
180+
m := 0
181+
for _, x := range arr2 {
182+
if m == 0 || x != arr2[m-1] {
183+
arr2[m] = x
184+
m++
185+
}
186+
}
187+
arr2 = arr2[:m]
188+
const inf = 1 << 30
189+
arr1 = append([]int{-inf}, arr1...)
190+
arr1 = append(arr1, inf)
191+
n := len(arr1)
192+
f := make([]int, n)
193+
for i := range f {
194+
f[i] = inf
195+
}
196+
f[0] = 0
197+
for i := 1; i < n; i++ {
198+
if arr1[i-1] < arr1[i] {
199+
f[i] = f[i-1]
200+
}
201+
j := sort.SearchInts(arr2, arr1[i])
202+
for k := 1; k <= min(i-1, j); k++ {
203+
if arr1[i-k-1] < arr2[j-k] {
204+
f[i] = min(f[i], f[i-k-1]+k)
205+
}
206+
}
207+
}
208+
if f[n-1] >= inf {
209+
return -1
210+
}
211+
return f[n-1]
212+
}
213+
214+
func min(a, b int) int {
215+
if a < b {
216+
return a
217+
}
218+
return b
219+
}
68220
```
69221

70222
### **...**

solution/1100-1199/1187.Make Array Strictly Increasing/README_EN.md

Lines changed: 141 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,8 @@
5151
<p><strong>Constraints:</strong></p>
5252

5353
<ul>
54-
5554
<li><code>1 &lt;= arr1.length, arr2.length &lt;= 2000</code></li>
56-
5755
<li><code>0 &lt;= arr1[i], arr2[i] &lt;= 10^9</code></li>
58-
5956
</ul>
6057

6158
<p>&nbsp;</p>
@@ -67,13 +64,153 @@
6764
### **Python3**
6865

6966
```python
70-
67+
class Solution:
68+
def makeArrayIncreasing(self, arr1: List[int], arr2: List[int]) -> int:
69+
arr2.sort()
70+
m = 0
71+
for x in arr2:
72+
if m == 0 or x != arr2[m - 1]:
73+
arr2[m] = x
74+
m += 1
75+
arr2 = arr2[:m]
76+
arr = [-inf] + arr1 + [inf]
77+
n = len(arr)
78+
f = [inf] * n
79+
f[0] = 0
80+
for i in range(1, n):
81+
if arr[i - 1] < arr[i]:
82+
f[i] = f[i - 1]
83+
j = bisect_left(arr2, arr[i])
84+
for k in range(1, min(i - 1, j) + 1):
85+
if arr[i - k - 1] < arr2[j - k]:
86+
f[i] = min(f[i], f[i - k - 1] + k)
87+
return -1 if f[n - 1] >= inf else f[n - 1]
7188
```
7289

7390
### **Java**
7491

7592
```java
93+
class Solution {
94+
public int makeArrayIncreasing(int[] arr1, int[] arr2) {
95+
Arrays.sort(arr2);
96+
int m = 0;
97+
for (int x : arr2) {
98+
if (m == 0 || x != arr2[m - 1]) {
99+
arr2[m++] = x;
100+
}
101+
}
102+
final int inf = 1 << 30;
103+
int[] arr = new int[arr1.length + 2];
104+
arr[0] = -inf;
105+
arr[arr.length - 1] = inf;
106+
System.arraycopy(arr1, 0, arr, 1, arr1.length);
107+
int[] f = new int[arr.length];
108+
Arrays.fill(f, inf);
109+
f[0] = 0;
110+
for (int i = 1; i < arr.length; ++i) {
111+
if (arr[i - 1] < arr[i]) {
112+
f[i] = f[i - 1];
113+
}
114+
int j = search(arr2, arr[i], m);
115+
for (int k = 1; k <= Math.min(i - 1, j); ++k) {
116+
if (arr[i - k - 1] < arr2[j - k]) {
117+
f[i] = Math.min(f[i], f[i - k - 1] + k);
118+
}
119+
}
120+
}
121+
return f[arr.length - 1] >= inf ? -1 : f[arr.length - 1];
122+
}
123+
124+
private int search(int[] nums, int x, int n) {
125+
int l = 0, r = n;
126+
while (l < r) {
127+
int mid = (l + r) >> 1;
128+
if (nums[mid] >= x) {
129+
r = mid;
130+
} else {
131+
l = mid + 1;
132+
}
133+
}
134+
return l;
135+
}
136+
}
137+
```
138+
139+
### **C++**
140+
141+
```cpp
142+
class Solution {
143+
public:
144+
int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2) {
145+
sort(arr2.begin(), arr2.end());
146+
arr2.erase(unique(arr2.begin(), arr2.end()), arr2.end());
147+
const int inf = 1 << 30;
148+
arr1.insert(arr1.begin(), -inf);
149+
arr1.push_back(inf);
150+
int n = arr1.size();
151+
vector<int> f(n, inf);
152+
f[0] = 0;
153+
for (int i = 1; i < n; ++i) {
154+
if (arr1[i - 1] < arr1[i]) {
155+
f[i] = f[i - 1];
156+
}
157+
int j = lower_bound(arr2.begin(), arr2.end(), arr1[i]) - arr2.begin();
158+
for (int k = 1; k <= min(i - 1, j); ++k) {
159+
if (arr1[i - k - 1] < arr2[j - k]) {
160+
f[i] = min(f[i], f[i - k - 1] + k);
161+
}
162+
}
163+
}
164+
return f[n - 1] >= inf ? -1 : f[n - 1];
165+
}
166+
};
167+
```
76168
169+
### **Go**
170+
171+
```go
172+
func makeArrayIncreasing(arr1 []int, arr2 []int) int {
173+
sort.Ints(arr2)
174+
m := 0
175+
for _, x := range arr2 {
176+
if m == 0 || x != arr2[m-1] {
177+
arr2[m] = x
178+
m++
179+
}
180+
}
181+
arr2 = arr2[:m]
182+
const inf = 1 << 30
183+
arr1 = append([]int{-inf}, arr1...)
184+
arr1 = append(arr1, inf)
185+
n := len(arr1)
186+
f := make([]int, n)
187+
for i := range f {
188+
f[i] = inf
189+
}
190+
f[0] = 0
191+
for i := 1; i < n; i++ {
192+
if arr1[i-1] < arr1[i] {
193+
f[i] = f[i-1]
194+
}
195+
j := sort.SearchInts(arr2, arr1[i])
196+
for k := 1; k <= min(i-1, j); k++ {
197+
if arr1[i-k-1] < arr2[j-k] {
198+
f[i] = min(f[i], f[i-k-1]+k)
199+
}
200+
}
201+
}
202+
if f[n-1] >= inf {
203+
return -1
204+
}
205+
return f[n-1]
206+
}
207+
208+
func min(a, b int) int {
209+
if a < b {
210+
return a
211+
}
212+
return b
213+
}
77214
```
78215

79216
### **...**
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2) {
4+
sort(arr2.begin(), arr2.end());
5+
arr2.erase(unique(arr2.begin(), arr2.end()), arr2.end());
6+
const int inf = 1 << 30;
7+
arr1.insert(arr1.begin(), -inf);
8+
arr1.push_back(inf);
9+
int n = arr1.size();
10+
vector<int> f(n, inf);
11+
f[0] = 0;
12+
for (int i = 1; i < n; ++i) {
13+
if (arr1[i - 1] < arr1[i]) {
14+
f[i] = f[i - 1];
15+
}
16+
int j = lower_bound(arr2.begin(), arr2.end(), arr1[i]) - arr2.begin();
17+
for (int k = 1; k <= min(i - 1, j); ++k) {
18+
if (arr1[i - k - 1] < arr2[j - k]) {
19+
f[i] = min(f[i], f[i - k - 1] + k);
20+
}
21+
}
22+
}
23+
return f[n - 1] >= inf ? -1 : f[n - 1];
24+
}
25+
};

0 commit comments

Comments
 (0)