Skip to content

Commit d922931

Browse files
committed
feat: add solutions to lc problem: No.0556
No.0556.Next Greater Element III
1 parent 4f4797c commit d922931

File tree

6 files changed

+245
-28
lines changed

6 files changed

+245
-28
lines changed

solution/0500-0599/0556.Next Greater Element III/README.md

+90-1
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,111 @@
3838

3939
<!-- 这里可写通用的实现逻辑 -->
4040

41+
**方法一:双指针**
42+
4143
<!-- tabs:start -->
4244

4345
### **Python3**
4446

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

4749
```python
48-
50+
class Solution:
51+
def nextGreaterElement(self, n: int) -> int:
52+
cs = list(str(n))
53+
n = len(cs)
54+
i, j = n - 2, n - 1
55+
while i >= 0 and cs[i] >= cs[i + 1]:
56+
i -= 1
57+
if i < 0:
58+
return -1
59+
while cs[i] >= cs[j]:
60+
j -= 1
61+
cs[i], cs[j] = cs[j], cs[i]
62+
cs[i + 1 :] = cs[i + 1 :][::-1]
63+
ans = int(''.join(cs))
64+
return -1 if ans > 2**31 - 1 else ans
4965
```
5066

5167
### **Java**
5268

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

5571
```java
72+
class Solution {
73+
public int nextGreaterElement(int n) {
74+
char[] cs = String.valueOf(n).toCharArray();
75+
n = cs.length;
76+
int i = n - 2, j = n - 1;
77+
for (; i >= 0 && cs[i] >= cs[i + 1]; --i);
78+
if (i < 0) {
79+
return -1;
80+
}
81+
for (; cs[i] >= cs[j]; --j);
82+
swap(cs, i, j);
83+
reverse(cs, i + 1, n - 1);
84+
long ans = Long.parseLong(String.valueOf(cs));
85+
return ans > Integer.MAX_VALUE ? -1 : (int) ans;
86+
}
87+
88+
private void swap(char[] cs, int i, int j) {
89+
char t = cs[i];
90+
cs[i] = cs[j];
91+
cs[j] = t;
92+
}
93+
94+
private void reverse(char[] cs, int i, int j) {
95+
for (; i < j; ++i, --j) {
96+
swap(cs, i, j);
97+
}
98+
}
99+
}
100+
```
101+
102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
int nextGreaterElement(int n) {
108+
string s = to_string(n);
109+
n = s.size();
110+
int i = n - 2, j = n - 1;
111+
for (; i >= 0 && s[i] >= s[i + 1]; --i);
112+
if (i < 0) return -1;
113+
for (; s[i] >= s[j]; --j);
114+
swap(s[i], s[j]);
115+
reverse(s.begin() + i + 1, s.end());
116+
long ans = stol(s);
117+
return ans > INT_MAX ? -1 : ans;
118+
}
119+
};
120+
```
56121
122+
### **Go**
123+
124+
```go
125+
func nextGreaterElement(n int) int {
126+
s := []byte(strconv.Itoa(n))
127+
n = len(s)
128+
i, j := n-2, n-1
129+
for ; i >= 0 && s[i] >= s[i+1]; i-- {
130+
}
131+
if i < 0 {
132+
return -1
133+
}
134+
for ; j >= 0 && s[i] >= s[j]; j-- {
135+
}
136+
s[i], s[j] = s[j], s[i]
137+
for i, j = i+1, n-1; i < j; i, j = i+1, j-1 {
138+
s[i], s[j] = s[j], s[i]
139+
}
140+
ans, _ := strconv.Atoi(string(s))
141+
if ans > math.MaxInt32 {
142+
return -1
143+
}
144+
return ans
145+
}
57146
```
58147

59148
### **...**

solution/0500-0599/0556.Next Greater Element III/README_EN.md

+88-1
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,100 @@
3030
### **Python3**
3131

3232
```python
33-
33+
class Solution:
34+
def nextGreaterElement(self, n: int) -> int:
35+
cs = list(str(n))
36+
n = len(cs)
37+
i, j = n - 2, n - 1
38+
while i >= 0 and cs[i] >= cs[i + 1]:
39+
i -= 1
40+
if i < 0:
41+
return -1
42+
while cs[i] >= cs[j]:
43+
j -= 1
44+
cs[i], cs[j] = cs[j], cs[i]
45+
cs[i + 1 :] = cs[i + 1 :][::-1]
46+
ans = int(''.join(cs))
47+
return -1 if ans > 2**31 - 1 else ans
3448
```
3549

3650
### **Java**
3751

3852
```java
53+
class Solution {
54+
public int nextGreaterElement(int n) {
55+
char[] cs = String.valueOf(n).toCharArray();
56+
n = cs.length;
57+
int i = n - 2, j = n - 1;
58+
for (; i >= 0 && cs[i] >= cs[i + 1]; --i);
59+
if (i < 0) {
60+
return -1;
61+
}
62+
for (; cs[i] >= cs[j]; --j);
63+
swap(cs, i, j);
64+
reverse(cs, i + 1, n - 1);
65+
long ans = Long.parseLong(String.valueOf(cs));
66+
return ans > Integer.MAX_VALUE ? -1 : (int) ans;
67+
}
68+
69+
private void swap(char[] cs, int i, int j) {
70+
char t = cs[i];
71+
cs[i] = cs[j];
72+
cs[j] = t;
73+
}
74+
75+
private void reverse(char[] cs, int i, int j) {
76+
for (; i < j; ++i, --j) {
77+
swap(cs, i, j);
78+
}
79+
}
80+
}
81+
```
82+
83+
### **C++**
84+
85+
```cpp
86+
class Solution {
87+
public:
88+
int nextGreaterElement(int n) {
89+
string s = to_string(n);
90+
n = s.size();
91+
int i = n - 2, j = n - 1;
92+
for (; i >= 0 && s[i] >= s[i + 1]; --i);
93+
if (i < 0) return -1;
94+
for (; s[i] >= s[j]; --j);
95+
swap(s[i], s[j]);
96+
reverse(s.begin() + i + 1, s.end());
97+
long ans = stol(s);
98+
return ans > INT_MAX ? -1 : ans;
99+
}
100+
};
101+
```
39102
103+
### **Go**
104+
105+
```go
106+
func nextGreaterElement(n int) int {
107+
s := []byte(strconv.Itoa(n))
108+
n = len(s)
109+
i, j := n-2, n-1
110+
for ; i >= 0 && s[i] >= s[i+1]; i-- {
111+
}
112+
if i < 0 {
113+
return -1
114+
}
115+
for ; j >= 0 && s[i] >= s[j]; j-- {
116+
}
117+
s[i], s[j] = s[j], s[i]
118+
for i, j = i+1, n-1; i < j; i, j = i+1, j-1 {
119+
s[i], s[j] = s[j], s[i]
120+
}
121+
ans, _ := strconv.Atoi(string(s))
122+
if ans > math.MaxInt32 {
123+
return -1
124+
}
125+
return ans
126+
}
40127
```
41128

42129
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int nextGreaterElement(int n) {
4+
string s = to_string(n);
5+
n = s.size();
6+
int i = n - 2, j = n - 1;
7+
for (; i >= 0 && s[i] >= s[i + 1]; --i);
8+
if (i < 0) return -1;
9+
for (; s[i] >= s[j]; --j);
10+
swap(s[i], s[j]);
11+
reverse(s.begin() + i + 1, s.end());
12+
long ans = stol(s);
13+
return ans > INT_MAX ? -1 : ans;
14+
}
15+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
func nextGreaterElement(n int) int {
2+
s := []byte(strconv.Itoa(n))
3+
n = len(s)
4+
i, j := n-2, n-1
5+
for ; i >= 0 && s[i] >= s[i+1]; i-- {
6+
}
7+
if i < 0 {
8+
return -1
9+
}
10+
for ; j >= 0 && s[i] >= s[j]; j-- {
11+
}
12+
s[i], s[j] = s[j], s[i]
13+
for i, j = i+1, n-1; i < j; i, j = i+1, j-1 {
14+
s[i], s[j] = s[j], s[i]
15+
}
16+
ans, _ := strconv.Atoi(string(s))
17+
if ans > math.MaxInt32 {
18+
return -1
19+
}
20+
return ans
21+
}
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,28 @@
11
class Solution {
22
public int nextGreaterElement(int n) {
3-
if (n < 12) {
4-
return -1;
5-
}
63
char[] cs = String.valueOf(n).toCharArray();
7-
int i = cs.length - 2;
8-
while (i >= 0 && cs[i] >= cs[i + 1]) {
9-
--i;
10-
}
4+
n = cs.length;
5+
int i = n - 2, j = n - 1;
6+
for (; i >= 0 && cs[i] >= cs[i + 1]; --i);
117
if (i < 0) {
128
return -1;
139
}
14-
int j = cs.length - 1;
15-
while (cs[i] >= cs[j]) {
16-
--j;
17-
}
10+
for (; cs[i] >= cs[j]; --j);
1811
swap(cs, i, j);
19-
reverse(cs, i + 1, cs.length - 1);
20-
long res = 0;
21-
for (char c : cs) {
22-
res = res * 10 + c - '0';
23-
}
24-
return res <= Integer.MAX_VALUE ? (int) res : -1;
25-
}
26-
27-
private void reverse(char[] cs, int i, int j) {
28-
while (i < j) {
29-
swap(cs, i++, j--);
30-
}
12+
reverse(cs, i + 1, n - 1);
13+
long ans = Long.parseLong(String.valueOf(cs));
14+
return ans > Integer.MAX_VALUE ? -1 : (int) ans;
3115
}
3216

3317
private void swap(char[] cs, int i, int j) {
34-
char tmp = cs[i];
18+
char t = cs[i];
3519
cs[i] = cs[j];
36-
cs[j] = tmp;
20+
cs[j] = t;
21+
}
22+
23+
private void reverse(char[] cs, int i, int j) {
24+
for (; i < j; ++i, --j) {
25+
swap(cs, i, j);
26+
}
3727
}
38-
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def nextGreaterElement(self, n: int) -> int:
3+
cs = list(str(n))
4+
n = len(cs)
5+
i, j = n - 2, n - 1
6+
while i >= 0 and cs[i] >= cs[i + 1]:
7+
i -= 1
8+
if i < 0:
9+
return -1
10+
while cs[i] >= cs[j]:
11+
j -= 1
12+
cs[i], cs[j] = cs[j], cs[i]
13+
cs[i + 1 :] = cs[i + 1 :][::-1]
14+
ans = int(''.join(cs))
15+
return -1 if ans > 2**31 - 1 else ans

0 commit comments

Comments
 (0)