Skip to content

Commit 4306cc8

Browse files
committed
feat: add solutions to lc problem: No.1053
No.1053.Previous Permutation With One Swap
1 parent c8a425f commit 4306cc8

File tree

6 files changed

+197
-15
lines changed

6 files changed

+197
-15
lines changed

solution/1000-1099/1053.Previous Permutation With One Swap/README.md

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

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

52+
**方法一:贪心**
53+
54+
我们先从右到左遍历数组,找到第一个满足 `arr[i - 1] > arr[i]` 的下标 `i`,此时 `arr[i - 1]` 就是我们要交换的数字,我们再从右到左遍历数组,找到第一个满足 `arr[j] < arr[i - 1]``arr[j] != arr[j - 1]` 的下标 `j`,此时我们交换 `arr[i - 1]``arr[j]` 后返回即可。
55+
56+
如果遍历完数组都没有找到满足条件的下标 `i`,说明数组已经是最小排列,直接返回原数组即可。
57+
58+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。
59+
5260
<!-- tabs:start -->
5361

5462
### **Python3**
5563

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

5866
```python
59-
67+
class Solution:
68+
def prevPermOpt1(self, arr: List[int]) -> List[int]:
69+
n = len(arr)
70+
for i in range(n - 1, 0, -1):
71+
if arr[i - 1] > arr[i]:
72+
for j in range(n - 1, i - 1, -1):
73+
if arr[j] < arr[i - 1] and arr[j] != arr[j - 1]:
74+
arr[i - 1], arr[j] = arr[j], arr[i - 1]
75+
return arr
76+
return arr
6077
```
6178

6279
### **Java**
6380

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

6683
```java
84+
class Solution {
85+
public int[] prevPermOpt1(int[] arr) {
86+
int n = arr.length;
87+
for (int i = n - 1; i > 0; --i) {
88+
if (arr[i - 1] > arr[i]) {
89+
for (int j = n - 1; j > i - 1; --j) {
90+
if (arr[j] < arr[i - 1] && arr[j] != arr[j - 1]) {
91+
int t = arr[i - 1];
92+
arr[i - 1] = arr[j];
93+
arr[j] = t;
94+
return arr;
95+
}
96+
}
97+
}
98+
}
99+
return arr;
100+
}
101+
}
102+
```
103+
104+
### **C++**
105+
106+
```cpp
107+
class Solution {
108+
public:
109+
vector<int> prevPermOpt1(vector<int>& arr) {
110+
int n = arr.size();
111+
for (int i = n - 1; i > 0; --i) {
112+
if (arr[i - 1] > arr[i]) {
113+
for (int j = n - 1; j > i - 1; --j) {
114+
if (arr[j] < arr[i - 1] && arr[j] != arr[j - 1]) {
115+
swap(arr[i - 1], arr[j]);
116+
return arr;
117+
}
118+
}
119+
}
120+
}
121+
return arr;
122+
}
123+
};
124+
```
67125
126+
### **Go**
127+
128+
```go
129+
func prevPermOpt1(arr []int) []int {
130+
n := len(arr)
131+
for i := n - 1; i > 0; i-- {
132+
if arr[i-1] > arr[i] {
133+
for j := n - 1; j > i-1; j-- {
134+
if arr[j] < arr[i-1] && arr[j] != arr[j-1] {
135+
arr[i-1], arr[j] = arr[j], arr[i-1]
136+
return arr
137+
}
138+
}
139+
}
140+
}
141+
return arr
142+
}
68143
```
69144

70145
### **...**

solution/1000-1099/1053.Previous Permutation With One Swap/README_EN.md

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,80 @@
4848
### **Python3**
4949

5050
```python
51-
51+
class Solution:
52+
def prevPermOpt1(self, arr: List[int]) -> List[int]:
53+
n = len(arr)
54+
for i in range(n - 1, 0, -1):
55+
if arr[i - 1] > arr[i]:
56+
for j in range(n - 1, i - 1, -1):
57+
if arr[j] < arr[i - 1] and arr[j] != arr[j - 1]:
58+
arr[i - 1], arr[j] = arr[j], arr[i - 1]
59+
return arr
60+
return arr
5261
```
5362

5463
### **Java**
5564

5665
```java
66+
class Solution {
67+
public int[] prevPermOpt1(int[] arr) {
68+
int n = arr.length;
69+
for (int i = n - 1; i > 0; --i) {
70+
if (arr[i - 1] > arr[i]) {
71+
for (int j = n - 1; j > i - 1; --j) {
72+
if (arr[j] < arr[i - 1] && arr[j] != arr[j - 1]) {
73+
int t = arr[i - 1];
74+
arr[i - 1] = arr[j];
75+
arr[j] = t;
76+
return arr;
77+
}
78+
}
79+
}
80+
}
81+
return arr;
82+
}
83+
}
84+
```
85+
86+
### **C++**
87+
88+
```cpp
89+
class Solution {
90+
public:
91+
vector<int> prevPermOpt1(vector<int>& arr) {
92+
int n = arr.size();
93+
for (int i = n - 1; i > 0; --i) {
94+
if (arr[i - 1] > arr[i]) {
95+
for (int j = n - 1; j > i - 1; --j) {
96+
if (arr[j] < arr[i - 1] && arr[j] != arr[j - 1]) {
97+
swap(arr[i - 1], arr[j]);
98+
return arr;
99+
}
100+
}
101+
}
102+
}
103+
return arr;
104+
}
105+
};
106+
```
57107
108+
### **Go**
109+
110+
```go
111+
func prevPermOpt1(arr []int) []int {
112+
n := len(arr)
113+
for i := n - 1; i > 0; i-- {
114+
if arr[i-1] > arr[i] {
115+
for j := n - 1; j > i-1; j-- {
116+
if arr[j] < arr[i-1] && arr[j] != arr[j-1] {
117+
arr[i-1], arr[j] = arr[j], arr[i-1]
118+
return arr
119+
}
120+
}
121+
}
122+
}
123+
return arr
124+
}
58125
```
59126

60127
### **...**
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
vector<int> prevPermOpt1(vector<int>& arr) {
4+
int n = arr.size();
5+
for (int i = n - 1; i > 0; --i) {
6+
if (arr[i - 1] > arr[i]) {
7+
for (int j = n - 1; j > i - 1; --j) {
8+
if (arr[j] < arr[i - 1] && arr[j] != arr[j - 1]) {
9+
swap(arr[i - 1], arr[j]);
10+
return arr;
11+
}
12+
}
13+
}
14+
}
15+
return arr;
16+
}
17+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
func prevPermOpt1(arr []int) []int {
2+
n := len(arr)
3+
for i := n - 1; i > 0; i-- {
4+
if arr[i-1] > arr[i] {
5+
for j := n - 1; j > i-1; j-- {
6+
if arr[j] < arr[i-1] && arr[j] != arr[j-1] {
7+
arr[i-1], arr[j] = arr[j], arr[i-1]
8+
return arr
9+
}
10+
}
11+
}
12+
}
13+
return arr
14+
}
Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
class Solution {
2-
public int[] prevPermOpt1(int[] A) {
3-
for (int i = A.length - 2; i >= 0; --i) {
4-
if (A[i] > A[i + 1]) {
5-
int k = i + 1;
6-
for (int j = k + 1; j < A.length; ++j) {
7-
if (A[j] < A[i] && A[j] > A[k]) {
8-
k = j;
2+
public int[] prevPermOpt1(int[] arr) {
3+
int n = arr.length;
4+
for (int i = n - 1; i > 0; --i) {
5+
if (arr[i - 1] > arr[i]) {
6+
for (int j = n - 1; j > i - 1; --j) {
7+
if (arr[j] < arr[i - 1] && arr[j] != arr[j - 1]) {
8+
int t = arr[i - 1];
9+
arr[i - 1] = arr[j];
10+
arr[j] = t;
11+
return arr;
912
}
1013
}
11-
int t = A[i];
12-
A[i] = A[k];
13-
A[k] = t;
14-
return A;
1514
}
1615
}
17-
return A;
16+
return arr;
1817
}
19-
}
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def prevPermOpt1(self, arr: List[int]) -> List[int]:
3+
n = len(arr)
4+
for i in range(n - 1, 0, -1):
5+
if arr[i - 1] > arr[i]:
6+
for j in range(n - 1, i - 1, -1):
7+
if arr[j] < arr[i - 1] and arr[j] != arr[j - 1]:
8+
arr[i - 1], arr[j] = arr[j], arr[i - 1]
9+
return arr
10+
return arr

0 commit comments

Comments
 (0)