Skip to content

Commit fe99865

Browse files
committed
feat: add solutions to lc problem: No.2340
No.2340.Minimum Adjacent Swaps to Make a Valid Array
1 parent 52b62c0 commit fe99865

File tree

7 files changed

+338
-3
lines changed

7 files changed

+338
-3
lines changed

solution/1200-1299/1271.Hexspeak/README.md

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

4646
将数字转换为十六进制字符串,然后遍历字符串,将数字 0 转换为字母 O,将数字 1 转换为字母 I,最后判断转换后的字符串是否合法。
4747

48-
时间复杂度 $O(\log n)$,其中 $n$ 为 `num` 的长度
48+
时间复杂度 $O(\log n)$,其中 $n$ 为 `num` 所表示的十进制数字的大小
4949

5050
<!-- tabs:start -->
5151

solution/2300-2399/2340.Minimum Adjacent Swaps to Make a Valid Array/README.md

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,143 @@ It can be shown that 6 swaps is the minimum swaps required to make a valid array
5555

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

58+
**方法一:贪心 + 分类讨论**
59+
60+
我们先找出数组中第一个最小值和最后一个最大值的位置,分别记为 $i$ 和 $j$。
61+
62+
如果 $i$ 和 $j$ 相等,说明数组已经是有效的,直接返回 $0$ 即可。
63+
64+
否则,我们判断 $i$ 是否在 $j$ 的左边,如果是,那么交换次数为 $i + n - 1 - j$;否则,交换次数为 $i + n - 2 - j$。
65+
66+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。
67+
5868
<!-- tabs:start -->
5969

6070
### **Python3**
6171

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

6474
```python
65-
75+
class Solution:
76+
def minimumSwaps(self, nums: List[int]) -> int:
77+
mi, mx = min(nums), max(nums)
78+
i, j = -1, -1
79+
for k, v in enumerate(nums):
80+
if v == mi and i == -1:
81+
i = k
82+
if v == mx:
83+
j = k
84+
if i == j:
85+
return 0
86+
n = len(nums)
87+
if i < j:
88+
return i + n - 1 - j
89+
return i + n - 2 - j
6690
```
6791

6892
### **Java**
6993

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

7296
```java
97+
class Solution {
98+
public int minimumSwaps(int[] nums) {
99+
int n = nums.length;
100+
int mi = min(nums), mx = max(nums);
101+
int i = -1, j = -1;
102+
for (int k = 0; k < n; ++k) {
103+
if (nums[k] == mi && i == -1) {
104+
i = k;
105+
}
106+
if (nums[k] == mx) {
107+
j = k;
108+
}
109+
}
110+
if (i == j) {
111+
return 0;
112+
}
113+
return i < j ? i + n - 1 - j : i + n - 2 - j;
114+
}
115+
116+
private int max(int[] nums) {
117+
int v = 0;
118+
for (int x : nums) {
119+
v = Math.max(v, x);
120+
}
121+
return v;
122+
}
123+
124+
private int min(int[] nums) {
125+
int v = nums[0];
126+
for (int x : nums) {
127+
v = Math.min(v, x);
128+
}
129+
return v;
130+
}
131+
}
132+
```
133+
134+
### **C++**
135+
136+
```cpp
137+
class Solution {
138+
public:
139+
int minimumSwaps(vector<int>& nums) {
140+
int n = nums.size();
141+
int mi = *min_element(nums.begin(), nums.end());
142+
int mx = *max_element(nums.begin(), nums.end());
143+
int i = -1, j = -1;
144+
for (int k = 0; k < n; ++k) {
145+
if (nums[k] == mi && i == -1) i = k;
146+
if (nums[k] == mx) j = k;
147+
}
148+
if (i == j) return 0;
149+
return i < j ? i + n - 1 - j : i + n - 2 - j;
150+
}
151+
};
152+
```
73153
154+
### **Go**
155+
156+
```go
157+
func minimumSwaps(nums []int) int {
158+
mi, mx := nums[0], 0
159+
for _, v := range nums {
160+
mi = min(mi, v)
161+
mx = max(mx, v)
162+
}
163+
i, j := -1, -1
164+
for k, v := range nums {
165+
if v == mi && i == -1 {
166+
i = k
167+
}
168+
if v == mx {
169+
j = k
170+
}
171+
}
172+
if i == j {
173+
return 0
174+
}
175+
n := len(nums)
176+
if i < j {
177+
return i + n - 1 - j
178+
}
179+
return i + n - 2 - j
180+
}
181+
182+
func max(a, b int) int {
183+
if a > b {
184+
return a
185+
}
186+
return b
187+
}
188+
189+
func min(a, b int) int {
190+
if a < b {
191+
return a
192+
}
193+
return b
194+
}
74195
```
75196

76197
### **TypeScript**

solution/2300-2399/2340.Minimum Adjacent Swaps to Make a Valid Array/README_EN.md

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,124 @@ It can be shown that 6 swaps is the minimum swaps required to make a valid array
5656
### **Python3**
5757

5858
```python
59-
59+
class Solution:
60+
def minimumSwaps(self, nums: List[int]) -> int:
61+
mi, mx = min(nums), max(nums)
62+
i, j = -1, -1
63+
for k, v in enumerate(nums):
64+
if v == mi and i == -1:
65+
i = k
66+
if v == mx:
67+
j = k
68+
if i == j:
69+
return 0
70+
n = len(nums)
71+
if i < j:
72+
return i + n - 1 - j
73+
return i + n - 2 - j
6074
```
6175

6276
### **Java**
6377

6478
```java
79+
class Solution {
80+
public int minimumSwaps(int[] nums) {
81+
int n = nums.length;
82+
int mi = min(nums), mx = max(nums);
83+
int i = -1, j = -1;
84+
for (int k = 0; k < n; ++k) {
85+
if (nums[k] == mi && i == -1) {
86+
i = k;
87+
}
88+
if (nums[k] == mx) {
89+
j = k;
90+
}
91+
}
92+
if (i == j) {
93+
return 0;
94+
}
95+
return i < j ? i + n - 1 - j : i + n - 2 - j;
96+
}
97+
98+
private int max(int[] nums) {
99+
int v = 0;
100+
for (int x : nums) {
101+
v = Math.max(v, x);
102+
}
103+
return v;
104+
}
105+
106+
private int min(int[] nums) {
107+
int v = nums[0];
108+
for (int x : nums) {
109+
v = Math.min(v, x);
110+
}
111+
return v;
112+
}
113+
}
114+
```
115+
116+
### **C++**
117+
118+
```cpp
119+
class Solution {
120+
public:
121+
int minimumSwaps(vector<int>& nums) {
122+
int n = nums.size();
123+
int mi = *min_element(nums.begin(), nums.end());
124+
int mx = *max_element(nums.begin(), nums.end());
125+
int i = -1, j = -1;
126+
for (int k = 0; k < n; ++k) {
127+
if (nums[k] == mi && i == -1) i = k;
128+
if (nums[k] == mx) j = k;
129+
}
130+
if (i == j) return 0;
131+
return i < j ? i + n - 1 - j : i + n - 2 - j;
132+
}
133+
};
134+
```
65135
136+
### **Go**
137+
138+
```go
139+
func minimumSwaps(nums []int) int {
140+
mi, mx := nums[0], 0
141+
for _, v := range nums {
142+
mi = min(mi, v)
143+
mx = max(mx, v)
144+
}
145+
i, j := -1, -1
146+
for k, v := range nums {
147+
if v == mi && i == -1 {
148+
i = k
149+
}
150+
if v == mx {
151+
j = k
152+
}
153+
}
154+
if i == j {
155+
return 0
156+
}
157+
n := len(nums)
158+
if i < j {
159+
return i + n - 1 - j
160+
}
161+
return i + n - 2 - j
162+
}
163+
164+
func max(a, b int) int {
165+
if a > b {
166+
return a
167+
}
168+
return b
169+
}
170+
171+
func min(a, b int) int {
172+
if a < b {
173+
return a
174+
}
175+
return b
176+
}
66177
```
67178

68179
### **TypeScript**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int minimumSwaps(vector<int>& nums) {
4+
int n = nums.size();
5+
int mi = *min_element(nums.begin(), nums.end());
6+
int mx = *max_element(nums.begin(), nums.end());
7+
int i = -1, j = -1;
8+
for (int k = 0; k < n; ++k) {
9+
if (nums[k] == mi && i == -1) i = k;
10+
if (nums[k] == mx) j = k;
11+
}
12+
if (i == j) return 0;
13+
return i < j ? i + n - 1 - j : i + n - 2 - j;
14+
}
15+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
func minimumSwaps(nums []int) int {
2+
mi, mx := nums[0], 0
3+
for _, v := range nums {
4+
mi = min(mi, v)
5+
mx = max(mx, v)
6+
}
7+
i, j := -1, -1
8+
for k, v := range nums {
9+
if v == mi && i == -1 {
10+
i = k
11+
}
12+
if v == mx {
13+
j = k
14+
}
15+
}
16+
if i == j {
17+
return 0
18+
}
19+
n := len(nums)
20+
if i < j {
21+
return i + n - 1 - j
22+
}
23+
return i + n - 2 - j
24+
}
25+
26+
func max(a, b int) int {
27+
if a > b {
28+
return a
29+
}
30+
return b
31+
}
32+
33+
func min(a, b int) int {
34+
if a < b {
35+
return a
36+
}
37+
return b
38+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
public int minimumSwaps(int[] nums) {
3+
int n = nums.length;
4+
int mi = min(nums), mx = max(nums);
5+
int i = -1, j = -1;
6+
for (int k = 0; k < n; ++k) {
7+
if (nums[k] == mi && i == -1) {
8+
i = k;
9+
}
10+
if (nums[k] == mx) {
11+
j = k;
12+
}
13+
}
14+
if (i == j) {
15+
return 0;
16+
}
17+
return i < j ? i + n - 1 - j : i + n - 2 - j;
18+
}
19+
20+
private int max(int[] nums) {
21+
int v = 0;
22+
for (int x : nums) {
23+
v = Math.max(v, x);
24+
}
25+
return v;
26+
}
27+
28+
private int min(int[] nums) {
29+
int v = nums[0];
30+
for (int x : nums) {
31+
v = Math.min(v, x);
32+
}
33+
return v;
34+
}
35+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def minimumSwaps(self, nums: List[int]) -> int:
3+
mi, mx = min(nums), max(nums)
4+
i, j = -1, -1
5+
for k, v in enumerate(nums):
6+
if v == mi and i == -1:
7+
i = k
8+
if v == mx:
9+
j = k
10+
if i == j:
11+
return 0
12+
n = len(nums)
13+
if i < j:
14+
return i + n - 1 - j
15+
return i + n - 2 - j

0 commit comments

Comments
 (0)