Skip to content

Commit 53f718f

Browse files
committed
feat: add solutions to lc problem: No.2340
No.2340.Minimum Adjacent Swaps to Make a Valid Array
1 parent 203fa91 commit 53f718f

File tree

7 files changed

+121
-196
lines changed

7 files changed

+121
-196
lines changed

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

Lines changed: 45 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,17 @@
5656

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

59-
**方法一:贪心 + 分类讨论**
59+
**方法一:维护最值下标 + 分类讨论**
6060

61-
我们先找出数组中第一个最小值和最后一个最大值的位置,分别记为 $i$ 和 $j$。
61+
我们可以用下标 $i$ 和 $j$ 分别记录数组 `nums` 第一个最小值和最后一个最大值的下标,遍历数组 `nums`,更新 $i$ 和 $j$ 的值
6262

63-
如果 $i$ 和 $j$ 相等,说明数组已经是有效的,直接返回 $0$ 即可
63+
接下来,我们需要考虑交换的次数
6464

65-
否则,我们判断 $i$ 是否在 $j$ 的左边,如果是,那么交换次数为 $i + n - 1 - j$;否则,交换次数为 $i + n - 2 - j$。
65+
- 如果 $i = j$,说明数组 `nums` 已经是有效数组,不需要交换,返回 $0$;
66+
- 如果 $i < j$,说明数组 `nums` 中最小值在最大值的左边,需要交换 $i + n - 1 - j$ 次,其中 $n$ 为数组 `nums` 的长度;
67+
- 如果 $i > j$,说明数组 `nums` 中最小值在最大值的右边,需要交换 $i + n - 1 - j - 1$ 次。
6668

67-
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度
69+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `nums` 的长度
6870

6971
<!-- tabs:start -->
7072

@@ -75,19 +77,13 @@
7577
```python
7678
class Solution:
7779
def minimumSwaps(self, nums: List[int]) -> int:
78-
mi, mx = min(nums), max(nums)
79-
i, j = -1, -1
80+
i = j = 0
8081
for k, v in enumerate(nums):
81-
if v == mi and i == -1:
82+
if v < nums[i] or (v == nums[i] and k < i):
8283
i = k
83-
if v == mx:
84+
if v >= nums[j] or (v == nums[j] and k > j):
8485
j = k
85-
if i == j:
86-
return 0
87-
n = len(nums)
88-
if i < j:
89-
return i + n - 1 - j
90-
return i + n - 2 - j
86+
return 0 if i == j else i + len(nums) - 1 - j - (i > j)
9187
```
9288

9389
### **Java**
@@ -98,36 +94,19 @@ class Solution:
9894
class Solution {
9995
public int minimumSwaps(int[] nums) {
10096
int n = nums.length;
101-
int mi = min(nums), mx = max(nums);
102-
int i = -1, j = -1;
97+
int i = 0, j = 0;
10398
for (int k = 0; k < n; ++k) {
104-
if (nums[k] == mi && i == -1) {
99+
if (nums[k] < nums[i] || (nums[k] == nums[i] && k < i)) {
105100
i = k;
106101
}
107-
if (nums[k] == mx) {
102+
if (nums[k] > nums[j] || (nums[k] == nums[j] && k > j)) {
108103
j = k;
109104
}
110105
}
111106
if (i == j) {
112107
return 0;
113108
}
114-
return i < j ? i + n - 1 - j : i + n - 2 - j;
115-
}
116-
117-
private int max(int[] nums) {
118-
int v = 0;
119-
for (int x : nums) {
120-
v = Math.max(v, x);
121-
}
122-
return v;
123-
}
124-
125-
private int min(int[] nums) {
126-
int v = nums[0];
127-
for (int x : nums) {
128-
v = Math.min(v, x);
129-
}
130-
return v;
109+
return i + n - 1 - j - (i > j ? 1 : 0);
131110
}
132111
}
133112
```
@@ -139,15 +118,19 @@ class Solution {
139118
public:
140119
int minimumSwaps(vector<int>& nums) {
141120
int n = nums.size();
142-
int mi = *min_element(nums.begin(), nums.end());
143-
int mx = *max_element(nums.begin(), nums.end());
144-
int i = -1, j = -1;
121+
int i = 0, j = 0;
145122
for (int k = 0; k < n; ++k) {
146-
if (nums[k] == mi && i == -1) i = k;
147-
if (nums[k] == mx) j = k;
123+
if (nums[k] < nums[i] || (nums[k] == nums[i] && k < i)) {
124+
i = k;
125+
}
126+
if (nums[k] > nums[j] || (nums[k] == nums[j] && k > j)) {
127+
j = k;
128+
}
129+
}
130+
if (i == j) {
131+
return 0;
148132
}
149-
if (i == j) return 0;
150-
return i < j ? i + n - 1 - j : i + n - 2 - j;
133+
return i + n - 1 - j - (i > j);
151134
}
152135
};
153136
```
@@ -156,49 +139,42 @@ public:
156139
157140
```go
158141
func minimumSwaps(nums []int) int {
159-
mi, mx := nums[0], 0
160-
for _, v := range nums {
161-
mi = min(mi, v)
162-
mx = max(mx, v)
163-
}
164-
i, j := -1, -1
142+
var i, j int
165143
for k, v := range nums {
166-
if v == mi && i == -1 {
144+
if v < nums[i] || (v == nums[i] && k < i) {
167145
i = k
168146
}
169-
if v == mx {
147+
if v > nums[j] || (v == nums[j] && k > j) {
170148
j = k
171149
}
172150
}
173151
if i == j {
174152
return 0
175153
}
176-
n := len(nums)
177154
if i < j {
178-
return i + n - 1 - j
179-
}
180-
return i + n - 2 - j
181-
}
182-
183-
func max(a, b int) int {
184-
if a > b {
185-
return a
186-
}
187-
return b
188-
}
189-
190-
func min(a, b int) int {
191-
if a < b {
192-
return a
155+
return i + len(nums) - 1 - j
193156
}
194-
return b
157+
return i + len(nums) - 2 - j
195158
}
196159
```
197160

198161
### **TypeScript**
199162

200163
```ts
201-
164+
function minimumSwaps(nums: number[]): number {
165+
let i = 0;
166+
let j = 0;
167+
const n = nums.length;
168+
for (let k = 0; k < n; ++k) {
169+
if (nums[k] < nums[i] || (nums[k] == nums[i] && k < i)) {
170+
i = k;
171+
}
172+
if (nums[k] > nums[j] || (nums[k] == nums[j] && k > j)) {
173+
j = k;
174+
}
175+
}
176+
return i == j ? 0 : i + n - 1 - j - (i > j ? 1 : 0);
177+
}
202178
```
203179

204180
### **...**

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

Lines changed: 38 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,13 @@ It can be shown that 6 swaps is the minimum swaps required to make a valid array
5858
```python
5959
class Solution:
6060
def minimumSwaps(self, nums: List[int]) -> int:
61-
mi, mx = min(nums), max(nums)
62-
i, j = -1, -1
61+
i = j = 0
6362
for k, v in enumerate(nums):
64-
if v == mi and i == -1:
63+
if v < nums[i] or (v == nums[i] and k < i):
6564
i = k
66-
if v == mx:
65+
if v >= nums[j] or (v == nums[j] and k > j):
6766
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
67+
return 0 if i == j else i + len(nums) - 1 - j - (i > j)
7468
```
7569

7670
### **Java**
@@ -79,36 +73,19 @@ class Solution:
7973
class Solution {
8074
public int minimumSwaps(int[] nums) {
8175
int n = nums.length;
82-
int mi = min(nums), mx = max(nums);
83-
int i = -1, j = -1;
76+
int i = 0, j = 0;
8477
for (int k = 0; k < n; ++k) {
85-
if (nums[k] == mi && i == -1) {
78+
if (nums[k] < nums[i] || (nums[k] == nums[i] && k < i)) {
8679
i = k;
8780
}
88-
if (nums[k] == mx) {
81+
if (nums[k] > nums[j] || (nums[k] == nums[j] && k > j)) {
8982
j = k;
9083
}
9184
}
9285
if (i == j) {
9386
return 0;
9487
}
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;
88+
return i + n - 1 - j - (i > j ? 1 : 0);
11289
}
11390
}
11491
```
@@ -120,15 +97,19 @@ class Solution {
12097
public:
12198
int minimumSwaps(vector<int>& nums) {
12299
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;
100+
int i = 0, j = 0;
126101
for (int k = 0; k < n; ++k) {
127-
if (nums[k] == mi && i == -1) i = k;
128-
if (nums[k] == mx) j = k;
102+
if (nums[k] < nums[i] || (nums[k] == nums[i] && k < i)) {
103+
i = k;
104+
}
105+
if (nums[k] > nums[j] || (nums[k] == nums[j] && k > j)) {
106+
j = k;
107+
}
108+
}
109+
if (i == j) {
110+
return 0;
129111
}
130-
if (i == j) return 0;
131-
return i < j ? i + n - 1 - j : i + n - 2 - j;
112+
return i + n - 1 - j - (i > j);
132113
}
133114
};
134115
```
@@ -137,49 +118,42 @@ public:
137118
138119
```go
139120
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
121+
var i, j int
146122
for k, v := range nums {
147-
if v == mi && i == -1 {
123+
if v < nums[i] || (v == nums[i] && k < i) {
148124
i = k
149125
}
150-
if v == mx {
126+
if v > nums[j] || (v == nums[j] && k > j) {
151127
j = k
152128
}
153129
}
154130
if i == j {
155131
return 0
156132
}
157-
n := len(nums)
158133
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
134+
return i + len(nums) - 1 - j
174135
}
175-
return b
136+
return i + len(nums) - 2 - j
176137
}
177138
```
178139

179140
### **TypeScript**
180141

181142
```ts
182-
143+
function minimumSwaps(nums: number[]): number {
144+
let i = 0;
145+
let j = 0;
146+
const n = nums.length;
147+
for (let k = 0; k < n; ++k) {
148+
if (nums[k] < nums[i] || (nums[k] == nums[i] && k < i)) {
149+
i = k;
150+
}
151+
if (nums[k] > nums[j] || (nums[k] == nums[j] && k > j)) {
152+
j = k;
153+
}
154+
}
155+
return i == j ? 0 : i + n - 1 - j - (i > j ? 1 : 0);
156+
}
183157
```
184158

185159
### **...**

solution/2300-2399/2340.Minimum Adjacent Swaps to Make a Valid Array/Solution.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ class Solution {
22
public:
33
int minimumSwaps(vector<int>& nums) {
44
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;
5+
int i = 0, j = 0;
86
for (int k = 0; k < n; ++k) {
9-
if (nums[k] == mi && i == -1) i = k;
10-
if (nums[k] == mx) j = k;
7+
if (nums[k] < nums[i] || (nums[k] == nums[i] && k < i)) {
8+
i = k;
9+
}
10+
if (nums[k] > nums[j] || (nums[k] == nums[j] && k > j)) {
11+
j = k;
12+
}
1113
}
12-
if (i == j) return 0;
13-
return i < j ? i + n - 1 - j : i + n - 2 - j;
14+
if (i == j) {
15+
return 0;
16+
}
17+
return i + n - 1 - j - (i > j);
1418
}
1519
};

0 commit comments

Comments
 (0)