Skip to content

Commit aadc4a6

Browse files
committed
feat: add solutions to lc problem: No.0801
No.0801.Minimum Swaps To Make Sequences Increasing
1 parent 5e9c6d7 commit aadc4a6

File tree

6 files changed

+251
-2
lines changed

6 files changed

+251
-2
lines changed

solution/0800-0899/0801.Minimum Swaps To Make Sequences Increasing/README.md

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,117 @@ A = [1, 3, 5, 7] , B = [1, 2, 3, 4]
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58+
**方法一:动态规划**
59+
60+
定义 $a$, $b$ 分别表示当前位置不交换和交换的最小交换次数,当 $i=0$ 时,有 $a=0, b=1$。
61+
62+
对于 $i\gt 0$,我们先将此时 $a$, $b$ 的值保存在 $x$, $y$ 中,然后分情况讨论:
63+
64+
如果 $nums1[i - 1] \ge nums1[i]$ 或者 $nums2[i - 1] \ge nums2[i]$,那么下标 $i-1$ 和 $i$ 对应的元素的相对位置必须发生变化,此时,如果前一个位置交换了,那么当前位置不交换,因此有 $a = y$;如果前一个位置没有交换,那么当前位置必须交换,因此有 $b = x + 1$。
65+
66+
否则,下标 $i-1$ 和 $i$ 对应的元素的相对位置可以不发生变化,那么有 $b=y+1$;另外,如果满足 $nums1[i - 1] \lt nums2[i]$ 并且 $nums2[i - 1] \lt nums1[i]$,那么下标 $i-1$ 和 $i$ 对应的元素的相对位置可以发生变化。此时 $a$ 和 $b$ 可以取较小值,因此有 $a = \min(a, y)$ 和 $b = \min(b, x + 1)$。
67+
68+
最后,返回 $a$ 和 $b$ 中较小值即可。
69+
70+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。
71+
5872
<!-- tabs:start -->
5973

6074
### **Python3**
6175

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

6478
```python
65-
79+
class Solution:
80+
def minSwap(self, nums1: List[int], nums2: List[int]) -> int:
81+
a, b = 0, 1
82+
for i in range(1, len(nums1)):
83+
x, y = a, b
84+
if nums1[i - 1] >= nums1[i] or nums2[i - 1] >= nums2[i]:
85+
a, b = y, x + 1
86+
else:
87+
b = y + 1
88+
if nums1[i - 1] < nums2[i] and nums2[i - 1] < nums1[i]:
89+
a, b = min(a, y), min(b, x + 1)
90+
return min(a, b)
6691
```
6792

6893
### **Java**
6994

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

7297
```java
98+
class Solution {
99+
public int minSwap(int[] nums1, int[] nums2) {
100+
int a = 0, b = 1;
101+
for (int i = 1; i < nums1.length; ++i) {
102+
int x = a, y = b;
103+
if (nums1[i - 1] >= nums1[i] || nums2[i - 1] >= nums2[i]) {
104+
a = y;
105+
b = x + 1;
106+
} else {
107+
b = y + 1;
108+
if (nums1[i - 1] < nums2[i] && nums2[i - 1] < nums1[i]) {
109+
a = Math.min(a, y);
110+
b = Math.min(b, x + 1);
111+
}
112+
}
113+
}
114+
return Math.min(a, b);
115+
}
116+
}
117+
```
118+
119+
### **C++**
120+
121+
```cpp
122+
class Solution {
123+
public:
124+
int minSwap(vector<int>& nums1, vector<int>& nums2) {
125+
int a = 0, b = 1, n = nums1.size();
126+
for (int i = 1; i < n; ++i) {
127+
int x = a, y = b;
128+
if (nums1[i - 1] >= nums1[i] || nums2[i - 1] >= nums2[i]) {
129+
a = y, b = x + 1;
130+
} else {
131+
b = y + 1;
132+
if (nums1[i - 1] < nums2[i] && nums2[i - 1] < nums1[i]) {
133+
a = min(a, y);
134+
b = min(b, x + 1);
135+
}
136+
}
137+
}
138+
return min(a, b);
139+
}
140+
};
141+
```
73142
143+
### **Go**
144+
145+
```go
146+
func minSwap(nums1 []int, nums2 []int) int {
147+
a, b, n := 0, 1, len(nums1)
148+
for i := 1; i < n; i++ {
149+
x, y := a, b
150+
if nums1[i-1] >= nums1[i] || nums2[i-1] >= nums2[i] {
151+
a, b = y, x+1
152+
} else {
153+
b = y + 1
154+
if nums1[i-1] < nums2[i] && nums2[i-1] < nums1[i] {
155+
a = min(a, y)
156+
b = min(b, x+1)
157+
}
158+
}
159+
}
160+
return min(a, b)
161+
}
162+
163+
func min(a, b int) int {
164+
if a < b {
165+
return a
166+
}
167+
return b
168+
}
74169
```
75170

76171
### **...**

solution/0800-0899/0801.Minimum Swaps To Make Sequences Increasing/README_EN.md

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,94 @@ which are both strictly increasing.
4949
### **Python3**
5050

5151
```python
52-
52+
class Solution:
53+
def minSwap(self, nums1: List[int], nums2: List[int]) -> int:
54+
a, b = 0, 1
55+
for i in range(1, len(nums1)):
56+
x, y = a, b
57+
if nums1[i - 1] >= nums1[i] or nums2[i - 1] >= nums2[i]:
58+
a, b = y, x + 1
59+
else:
60+
b = y + 1
61+
if nums1[i - 1] < nums2[i] and nums2[i - 1] < nums1[i]:
62+
a, b = min(a, y), min(b, x + 1)
63+
return min(a, b)
5364
```
5465

5566
### **Java**
5667

5768
```java
69+
class Solution {
70+
public int minSwap(int[] nums1, int[] nums2) {
71+
int a = 0, b = 1;
72+
for (int i = 1; i < nums1.length; ++i) {
73+
int x = a, y = b;
74+
if (nums1[i - 1] >= nums1[i] || nums2[i - 1] >= nums2[i]) {
75+
a = y;
76+
b = x + 1;
77+
} else {
78+
b = y + 1;
79+
if (nums1[i - 1] < nums2[i] && nums2[i - 1] < nums1[i]) {
80+
a = Math.min(a, y);
81+
b = Math.min(b, x + 1);
82+
}
83+
}
84+
}
85+
return Math.min(a, b);
86+
}
87+
}
88+
```
89+
90+
### **C++**
91+
92+
```cpp
93+
class Solution {
94+
public:
95+
int minSwap(vector<int>& nums1, vector<int>& nums2) {
96+
int a = 0, b = 1, n = nums1.size();
97+
for (int i = 1; i < n; ++i) {
98+
int x = a, y = b;
99+
if (nums1[i - 1] >= nums1[i] || nums2[i - 1] >= nums2[i]) {
100+
a = y, b = x + 1;
101+
} else {
102+
b = y + 1;
103+
if (nums1[i - 1] < nums2[i] && nums2[i - 1] < nums1[i]) {
104+
a = min(a, y);
105+
b = min(b, x + 1);
106+
}
107+
}
108+
}
109+
return min(a, b);
110+
}
111+
};
112+
```
58113
114+
### **Go**
115+
116+
```go
117+
func minSwap(nums1 []int, nums2 []int) int {
118+
a, b, n := 0, 1, len(nums1)
119+
for i := 1; i < n; i++ {
120+
x, y := a, b
121+
if nums1[i-1] >= nums1[i] || nums2[i-1] >= nums2[i] {
122+
a, b = y, x+1
123+
} else {
124+
b = y + 1
125+
if nums1[i-1] < nums2[i] && nums2[i-1] < nums1[i] {
126+
a = min(a, y)
127+
b = min(b, x+1)
128+
}
129+
}
130+
}
131+
return min(a, b)
132+
}
133+
134+
func min(a, b int) int {
135+
if a < b {
136+
return a
137+
}
138+
return b
139+
}
59140
```
60141

61142
### **...**
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
int minSwap(vector<int>& nums1, vector<int>& nums2) {
4+
int a = 0, b = 1, n = nums1.size();
5+
for (int i = 1; i < n; ++i) {
6+
int x = a, y = b;
7+
if (nums1[i - 1] >= nums1[i] || nums2[i - 1] >= nums2[i]) {
8+
a = y, b = x + 1;
9+
} else {
10+
b = y + 1;
11+
if (nums1[i - 1] < nums2[i] && nums2[i - 1] < nums1[i]) {
12+
a = min(a, y);
13+
b = min(b, x + 1);
14+
}
15+
}
16+
}
17+
return min(a, b);
18+
}
19+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func minSwap(nums1 []int, nums2 []int) int {
2+
a, b, n := 0, 1, len(nums1)
3+
for i := 1; i < n; i++ {
4+
x, y := a, b
5+
if nums1[i-1] >= nums1[i] || nums2[i-1] >= nums2[i] {
6+
a, b = y, x+1
7+
} else {
8+
b = y + 1
9+
if nums1[i-1] < nums2[i] && nums2[i-1] < nums1[i] {
10+
a = min(a, y)
11+
b = min(b, x+1)
12+
}
13+
}
14+
}
15+
return min(a, b)
16+
}
17+
18+
func min(a, b int) int {
19+
if a < b {
20+
return a
21+
}
22+
return b
23+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public int minSwap(int[] nums1, int[] nums2) {
3+
int a = 0, b = 1;
4+
for (int i = 1; i < nums1.length; ++i) {
5+
int x = a, y = b;
6+
if (nums1[i - 1] >= nums1[i] || nums2[i - 1] >= nums2[i]) {
7+
a = y;
8+
b = x + 1;
9+
} else {
10+
b = y + 1;
11+
if (nums1[i - 1] < nums2[i] && nums2[i - 1] < nums1[i]) {
12+
a = Math.min(a, y);
13+
b = Math.min(b, x + 1);
14+
}
15+
}
16+
}
17+
return Math.min(a, b);
18+
}
19+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def minSwap(self, nums1: List[int], nums2: List[int]) -> int:
3+
a, b = 0, 1
4+
for i in range(1, len(nums1)):
5+
x, y = a, b
6+
if nums1[i - 1] >= nums1[i] or nums2[i - 1] >= nums2[i]:
7+
a, b = y, x + 1
8+
else:
9+
b = y + 1
10+
if nums1[i - 1] < nums2[i] and nums2[i - 1] < nums1[i]:
11+
a, b = min(a, y), min(b, x + 1)
12+
return min(a, b)

0 commit comments

Comments
 (0)