Skip to content

Commit 350f7d2

Browse files
committed
feat: add solutions to lc problem: No.0031
No.0031.Next Permutation
1 parent 69398f9 commit 350f7d2

File tree

11 files changed

+264
-110
lines changed

11 files changed

+264
-110
lines changed

solution/0000-0099/0030.Substring with Concatenation of All Words/README.md

+28
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,34 @@ public:
188188
};
189189
```
190190
191+
```cpp
192+
class Solution {
193+
public:
194+
vector<int> findSubstring(string s, vector<string>& words) {
195+
unordered_map<string, int> d;
196+
for (auto& w : words) ++d[w];
197+
vector<int> ans;
198+
int n = s.size(), m = words.size(), k = words[0].size();
199+
for (int i = 0; i < k; ++i) {
200+
int cnt = 0;
201+
unordered_map<string, int> t;
202+
for (int j = i; j <= n; j += k) {
203+
if (j - i >= m * k) {
204+
auto s1 = s.substr(j - m * k, k);
205+
--t[s1];
206+
cnt -= d[s1] > t[s1];
207+
}
208+
auto s2 = s.substr(j, k);
209+
++t[s2];
210+
cnt += d[s2] >= t[s2];
211+
if (cnt == m) ans.emplace_back(j - (m - 1) * k);
212+
}
213+
}
214+
return ans;
215+
}
216+
};
217+
```
218+
191219
### **Go**
192220

193221
```go

solution/0000-0099/0030.Substring with Concatenation of All Words/README_EN.md

+28
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,34 @@ public:
177177
};
178178
```
179179
180+
```cpp
181+
class Solution {
182+
public:
183+
vector<int> findSubstring(string s, vector<string>& words) {
184+
unordered_map<string, int> d;
185+
for (auto& w : words) ++d[w];
186+
vector<int> ans;
187+
int n = s.size(), m = words.size(), k = words[0].size();
188+
for (int i = 0; i < k; ++i) {
189+
int cnt = 0;
190+
unordered_map<string, int> t;
191+
for (int j = i; j <= n; j += k) {
192+
if (j - i >= m * k) {
193+
auto s1 = s.substr(j - m * k, k);
194+
--t[s1];
195+
cnt -= d[s1] > t[s1];
196+
}
197+
auto s2 = s.substr(j, k);
198+
++t[s2];
199+
cnt += d[s2] >= t[s2];
200+
if (cnt == m) ans.emplace_back(j - (m - 1) * k);
201+
}
202+
}
203+
return ans;
204+
}
205+
};
206+
```
207+
180208
### **Go**
181209

182210
```go

solution/0000-0099/0031.Next Permutation/README.md

+82-14
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,65 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63+
**方法一:两次遍历**
64+
65+
从后往前遍历数组,找到第一个下降的位置 $i$,即 $nums[i] \lt nums[i + 1]$。
66+
67+
然后从后往前遍历数组,找到第一个大于 $nums[i]$ 的位置 $j$,即 $nums[j] \gt nums[i]$。交换 $nums[i]$ 和 $nums[j]$,然后将 $nums[i + 1]$ 到 $nums[n - 1]$ 的元素反转,即可得到下一个排列。
68+
69+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
70+
6371
<!-- tabs:start -->
6472

6573
### **Python3**
6674

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

6977
```python
70-
78+
class Solution:
79+
def nextPermutation(self, nums: List[int]) -> None:
80+
n = len(nums)
81+
i = next((i for i in range(n - 2, -1, -1) if nums[i] < nums[i + 1]), -1)
82+
if ~i:
83+
j = next((j for j in range(n - 1, i, -1) if nums[j] > nums[i]))
84+
nums[i], nums[j] = nums[j], nums[i]
85+
nums[i + 1 :] = nums[i + 1 :][::-1]
7186
```
7287

7388
### **Java**
7489

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

7792
```java
93+
class Solution {
94+
public void nextPermutation(int[] nums) {
95+
int n = nums.length;
96+
int i = n - 2;
97+
for (; i >= 0; --i) {
98+
if (nums[i] < nums[i + 1]) {
99+
break;
100+
}
101+
}
102+
if (i >= 0) {
103+
for (int j = n - 1; j > i; --j) {
104+
if (nums[j] > nums[i]) {
105+
swap(nums, i, j);
106+
break;
107+
}
108+
}
109+
}
78110

111+
for (int j = i + 1, k = n - 1; j < k; ++j, --k) {
112+
swap(nums, j, k);
113+
}
114+
}
115+
116+
private void swap(int[] nums, int i, int j) {
117+
int t = nums[j];
118+
nums[j] = nums[i];
119+
nums[i] = t;
120+
}
121+
}
79122
```
80123

81124
### **C++**
@@ -84,26 +127,51 @@
84127
class Solution {
85128
public:
86129
void nextPermutation(vector<int>& nums) {
87-
int i, j;
88130
int n = nums.size();
89-
for (i = n - 2; i >= 0; i--) {
90-
if (nums[i] < nums[i + 1]) {
91-
break;
92-
}
93-
}
94-
if (i < 0)
95-
reverse(nums.begin(), nums.end());
96-
else {
97-
for (j = n - 1; j >= 0; j--) {
98-
if (nums[i] < nums[j]) {
131+
int i = n - 2;
132+
for (; ~i; --i) if (nums[i] < nums[i + 1]) break;
133+
if (~i) {
134+
for (int j = n - 1; j > i; --j) {
135+
if (nums[j] > nums[i]) {
136+
swap(nums[i], nums[j]);
99137
break;
100138
}
101139
}
102-
swap(nums[i], nums[j]);
103-
reverse(nums.begin() + i + 1, nums.end());
104140
}
141+
reverse(nums.begin() + i + 1, nums.end());
105142
}
106143
};
107144
```
108145
146+
### **Go**
147+
148+
```go
149+
func nextPermutation(nums []int) {
150+
n := len(nums)
151+
i := n - 2
152+
for ; i >= 0; i-- {
153+
if nums[i] < nums[i+1] {
154+
break
155+
}
156+
}
157+
if i >= 0 {
158+
for j := n - 1; j > i; j-- {
159+
if nums[j] > nums[i] {
160+
nums[i], nums[j] = nums[j], nums[i]
161+
break
162+
}
163+
}
164+
}
165+
for j, k := i+1, n-1; j < k; j, k = j+1, k-1 {
166+
nums[j], nums[k] = nums[k], nums[j]
167+
}
168+
}
169+
```
170+
171+
### **...**
172+
173+
```
174+
175+
```
176+
109177
<!-- tabs:end -->

solution/0000-0099/0031.Next Permutation/README_EN.md

+74-14
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,48 @@
5959
### **Python3**
6060

6161
```python
62-
62+
class Solution:
63+
def nextPermutation(self, nums: List[int]) -> None:
64+
n = len(nums)
65+
i = next((i for i in range(n - 2, -1, -1) if nums[i] < nums[i + 1]), -1)
66+
if ~i:
67+
j = next((j for j in range(n - 1, i, -1) if nums[j] > nums[i]))
68+
nums[i], nums[j] = nums[j], nums[i]
69+
nums[i + 1 :] = nums[i + 1 :][::-1]
6370
```
6471

6572
### **Java**
6673

6774
```java
75+
class Solution {
76+
public void nextPermutation(int[] nums) {
77+
int n = nums.length;
78+
int i = n - 2;
79+
for (; i >= 0; --i) {
80+
if (nums[i] < nums[i + 1]) {
81+
break;
82+
}
83+
}
84+
if (i >= 0) {
85+
for (int j = n - 1; j > i; --j) {
86+
if (nums[j] > nums[i]) {
87+
swap(nums, i, j);
88+
break;
89+
}
90+
}
91+
}
92+
93+
for (int j = i + 1, k = n - 1; j < k; ++j, --k) {
94+
swap(nums, j, k);
95+
}
96+
}
6897

98+
private void swap(int[] nums, int i, int j) {
99+
int t = nums[j];
100+
nums[j] = nums[i];
101+
nums[i] = t;
102+
}
103+
}
69104
```
70105

71106
### **C++**
@@ -74,26 +109,51 @@
74109
class Solution {
75110
public:
76111
void nextPermutation(vector<int>& nums) {
77-
int i, j;
78112
int n = nums.size();
79-
for (i = n - 2; i >= 0; i--) {
80-
if (nums[i] < nums[i + 1]) {
81-
break;
82-
}
83-
}
84-
if (i < 0)
85-
reverse(nums.begin(), nums.end());
86-
else {
87-
for (j = n - 1; j >= 0; j--) {
88-
if (nums[i] < nums[j]) {
113+
int i = n - 2;
114+
for (; ~i; --i) if (nums[i] < nums[i + 1]) break;
115+
if (~i) {
116+
for (int j = n - 1; j > i; --j) {
117+
if (nums[j] > nums[i]) {
118+
swap(nums[i], nums[j]);
89119
break;
90120
}
91121
}
92-
swap(nums[i], nums[j]);
93-
reverse(nums.begin() + i + 1, nums.end());
94122
}
123+
reverse(nums.begin() + i + 1, nums.end());
95124
}
96125
};
97126
```
98127
128+
### **Go**
129+
130+
```go
131+
func nextPermutation(nums []int) {
132+
n := len(nums)
133+
i := n - 2
134+
for ; i >= 0; i-- {
135+
if nums[i] < nums[i+1] {
136+
break
137+
}
138+
}
139+
if i >= 0 {
140+
for j := n - 1; j > i; j-- {
141+
if nums[j] > nums[i] {
142+
nums[i], nums[j] = nums[j], nums[i]
143+
break
144+
}
145+
}
146+
}
147+
for j, k := i+1, n-1; j < k; j, k = j+1, k-1 {
148+
nums[j], nums[k] = nums[k], nums[j]
149+
}
150+
}
151+
```
152+
153+
### **...**
154+
155+
```
156+
157+
```
158+
99159
<!-- tabs:end -->
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
class Solution {
22
public:
33
void nextPermutation(vector<int>& nums) {
4-
int i, j;
54
int n = nums.size();
6-
for (i = n - 2; i >= 0; i--) {
7-
if (nums[i] < nums[i + 1]) {
8-
break;
9-
}
10-
}
11-
if (i < 0)
12-
reverse(nums.begin(), nums.end());
13-
else {
14-
for (j = n - 1; j >= 0; j--) {
15-
if (nums[i] < nums[j]) {
5+
int i = n - 2;
6+
for (; ~i; --i) if (nums[i] < nums[i + 1]) break;
7+
if (~i) {
8+
for (int j = n - 1; j > i; --j) {
9+
if (nums[j] > nums[i]) {
10+
swap(nums[i], nums[j]);
1611
break;
1712
}
1813
}
19-
swap(nums[i], nums[j]);
20-
reverse(nums.begin() + i + 1, nums.end());
2114
}
15+
reverse(nums.begin() + i + 1, nums.end());
2216
}
23-
};
17+
};
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,20 @@
1-
type sortInt []int
2-
3-
func (s sortInt) Len() int {
4-
return len(s)
5-
}
6-
7-
func (s sortInt) Less(i, j int) bool{
8-
return s[i] > s[j]
9-
}
10-
11-
func (s sortInt) Swap(i, j int) {
12-
s[i], s[j] = s[j], s[i]
13-
}
14-
15-
func nextPermutation(nums []int) {
16-
newNums := sortInt(nums)
17-
if sort.IsSorted(newNums) {
18-
n := sort.Reverse(newNums)
19-
sort.Sort(n)
20-
return
1+
func nextPermutation(nums []int) {
2+
n := len(nums)
3+
i := n - 2
4+
for ; i >= 0; i-- {
5+
if nums[i] < nums[i+1] {
6+
break
7+
}
218
}
22-
for i := len(nums) -2 ; i >= 0 ; i-- {
23-
for j := len(nums) - 1 ; j > i ; j-- {
24-
if nums[i] < nums[j] {
25-
nums[i],nums[j] = nums[j], nums[i]
26-
sort.Sort(sort.Reverse(newNums[i+1:]))
27-
return
9+
if i >= 0 {
10+
for j := n - 1; j > i; j-- {
11+
if nums[j] > nums[i] {
12+
nums[i], nums[j] = nums[j], nums[i]
13+
break
2814
}
2915
}
3016
}
31-
}
17+
for j, k := i+1, n-1; j < k; j, k = j+1, k-1 {
18+
nums[j], nums[k] = nums[k], nums[j]
19+
}
20+
}

0 commit comments

Comments
 (0)