Skip to content

Commit c914d71

Browse files
committed
feat: update solutions to lc/lcof2 problems
* lc No.0496 & lcof2 No.038.Next Greater Element I
1 parent 62e468a commit c914d71

File tree

20 files changed

+764
-135
lines changed

20 files changed

+764
-135
lines changed

lcof2/剑指 Offer II 038. 每日温度/README.md

+85-12
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:单调栈**
49+
4850
单调栈常见模型:找出每个数左/右边**离它最近的****比它大/小的数**。模板:
4951

5052
```python
@@ -64,14 +66,29 @@ for i in range(n):
6466
```python
6567
class Solution:
6668
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
67-
res = [0] * len(temperatures)
69+
ans = [0] * len(temperatures)
6870
stk = []
6971
for i, t in enumerate(temperatures):
7072
while stk and temperatures[stk[-1]] < t:
7173
j = stk.pop()
72-
res[j] = i - j
74+
ans[j] = i - j
75+
stk.append(i)
76+
return ans
77+
```
78+
79+
```python
80+
class Solution:
81+
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
82+
n = len(temperatures)
83+
stk = []
84+
ans = [0] * n
85+
for i in range(n - 1, -1, -1):
86+
while stk and temperatures[stk[-1]] <= temperatures[i]:
87+
stk.pop()
88+
if stk:
89+
ans[i] = stk[-1] - i
7390
stk.append(i)
74-
return res
91+
return ans
7592
```
7693

7794
### **Java**
@@ -82,16 +99,36 @@ class Solution:
8299
class Solution {
83100
public int[] dailyTemperatures(int[] temperatures) {
84101
int n = temperatures.length;
85-
int[] res = new int[n];
102+
int[] ans = new int[n];
86103
Deque<Integer> stk = new ArrayDeque<>();
87104
for (int i = 0; i < n; ++i) {
88105
while (!stk.isEmpty() && temperatures[stk.peek()] < temperatures[i]) {
89106
int j = stk.pop();
90-
res[j] = i - j;
107+
ans[j] = i - j;
91108
}
92109
stk.push(i);
93110
}
94-
return res;
111+
return ans;
112+
}
113+
}
114+
```
115+
116+
```java
117+
class Solution {
118+
public int[] dailyTemperatures(int[] temperatures) {
119+
int n = temperatures.length;
120+
Deque<Integer> stk = new ArrayDeque<>();
121+
int[] ans = new int[n];
122+
for (int i = n - 1; i >= 0; --i) {
123+
while (!stk.isEmpty() && temperatures[stk.peek()] <= temperatures[i]) {
124+
stk.pop();
125+
}
126+
if (!stk.isEmpty()) {
127+
ans[i] = stk.peek() - i;
128+
}
129+
stk.push(i);
130+
}
131+
return ans;
95132
}
96133
}
97134
```
@@ -105,18 +142,36 @@ class Solution {
105142
public:
106143
vector<int> dailyTemperatures(vector<int> &temperatures) {
107144
int n = temperatures.size();
108-
vector<int> res(n);
145+
vector<int> ans(n);
109146
stack<int> stk;
110147
for (int i = 0; i < n; ++i)
111148
{
112149
while (!stk.empty() && temperatures[stk.top()] < temperatures[i])
113150
{
114-
res[stk.top()] = i - stk.top();
151+
ans[stk.top()] = i - stk.top();
115152
stk.pop();
116153
}
117154
stk.push(i);
118155
}
119-
return res;
156+
return ans;
157+
}
158+
};
159+
```
160+
161+
```cpp
162+
class Solution {
163+
public:
164+
vector<int> dailyTemperatures(vector<int> &temperatures) {
165+
int n = temperatures.size();
166+
vector<int> ans(n);
167+
stack<int> stk;
168+
for (int i = n - 1; ~i; --i)
169+
{
170+
while (!stk.empty() && temperatures[stk.top()] <= temperatures[i]) stk.pop();
171+
if (!stk.empty()) ans[i] = stk.top() - i;
172+
stk.push(i);
173+
}
174+
return ans;
120175
}
121176
};
122177
```
@@ -125,17 +180,35 @@ public:
125180

126181
```go
127182
func dailyTemperatures(temperatures []int) []int {
128-
res := make([]int, len(temperatures))
183+
ans := make([]int, len(temperatures))
129184
var stk []int
130185
for i, t := range temperatures {
131186
for len(stk) > 0 && temperatures[stk[len(stk)-1]] < t {
132187
j := stk[len(stk)-1]
133-
res[j] = i - j
188+
ans[j] = i - j
134189
stk = stk[:len(stk)-1]
135190
}
136191
stk = append(stk, i)
137192
}
138-
return res
193+
return ans
194+
}
195+
```
196+
197+
```go
198+
func dailyTemperatures(temperatures []int) []int {
199+
n := len(temperatures)
200+
ans := make([]int, n)
201+
var stk []int
202+
for i := n - 1; i >= 0; i-- {
203+
for len(stk) > 0 && temperatures[stk[len(stk)-1]] <= temperatures[i] {
204+
stk = stk[:len(stk)-1]
205+
}
206+
if len(stk) > 0 {
207+
ans[i] = stk[len(stk)-1] - i
208+
}
209+
stk = append(stk, i)
210+
}
211+
return ans
139212
}
140213
```
141214

lcof2/剑指 Offer II 038. 每日温度/Solution.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ class Solution {
22
public:
33
vector<int> dailyTemperatures(vector<int> &temperatures) {
44
int n = temperatures.size();
5-
vector<int> res(n);
5+
vector<int> ans(n);
66
stack<int> stk;
77
for (int i = 0; i < n; ++i)
88
{
99
while (!stk.empty() && temperatures[stk.top()] < temperatures[i])
1010
{
11-
res[stk.top()] = i - stk.top();
11+
ans[stk.top()] = i - stk.top();
1212
stk.pop();
1313
}
1414
stk.push(i);
1515
}
16-
return res;
16+
return ans;
1717
}
1818
};
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
func dailyTemperatures(temperatures []int) []int {
2-
res := make([]int, len(temperatures))
2+
ans := make([]int, len(temperatures))
33
var stk []int
44
for i, t := range temperatures {
55
for len(stk) > 0 && temperatures[stk[len(stk)-1]] < t {
66
j := stk[len(stk)-1]
7-
res[j] = i - j
7+
ans[j] = i - j
88
stk = stk[:len(stk)-1]
99
}
1010
stk = append(stk, i)
1111
}
12-
return res
12+
return ans
1313
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
class Solution {
22
public int[] dailyTemperatures(int[] temperatures) {
33
int n = temperatures.length;
4-
int[] res = new int[n];
4+
int[] ans = new int[n];
55
Deque<Integer> stk = new ArrayDeque<>();
66
for (int i = 0; i < n; ++i) {
77
while (!stk.isEmpty() && temperatures[stk.peek()] < temperatures[i]) {
88
int j = stk.pop();
9-
res[j] = i - j;
9+
ans[j] = i - j;
1010
}
1111
stk.push(i);
1212
}
13-
return res;
13+
return ans;
1414
}
1515
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
class Solution:
22
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
3-
res = [0] * len(temperatures)
3+
ans = [0] * len(temperatures)
44
stk = []
55
for i, t in enumerate(temperatures):
66
while stk and temperatures[stk[-1]] < t:
77
j = stk.pop()
8-
res[j] = i - j
8+
ans[j] = i - j
99
stk.append(i)
10-
return res
10+
return ans

solution/0400-0499/0496.Next Greater Element I/README.md

+108-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@
5757

5858
**方法一:单调栈**
5959

60-
先对将 nums2 中的每一个元素,求出其下一个更大的元素。随后对于将这些答案放入哈希映射(HashMap)中,再遍历数组 nums1,并直接找出答案。对于 nums2,可以使用单调栈来解决这个问题。
61-
6260
单调栈常见模型:找出每个数左/右边**离它最近的****比它大/小的数**。模板:
6361

6462
```python
@@ -69,6 +67,10 @@ for i in range(n):
6967
stk.append(i)
7068
```
7169

70+
对于本题,先对将 $nums2$ 中的每一个元素,求出其下一个更大的元素。随后对于将这些答案放入哈希表 $m$ 中,再遍历数组 $nums1$,并直接找出答案。对于 $nums2$,可以使用单调栈来解决这个问题。
71+
72+
时间复杂度 $O(M+N)$,其中 $M$ 表示 $nums1$ 的长度,$N$ 表示 $nums2$ 的长度。
73+
7274
<!-- tabs:start -->
7375

7476
### **Python3**
@@ -87,6 +89,20 @@ class Solution:
8789
return [m.get(v, -1) for v in nums1]
8890
```
8991

92+
```python
93+
class Solution:
94+
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
95+
m = {}
96+
stk = []
97+
for v in nums2[::-1]:
98+
while stk and stk[-1] <= v:
99+
stk.pop()
100+
if stk:
101+
m[v] = stk[-1]
102+
stk.append(v)
103+
return [m.get(x, -1) for x in nums1]
104+
```
105+
90106
### **Java**
91107

92108
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -112,6 +128,30 @@ class Solution {
112128
}
113129
```
114130

131+
```java
132+
class Solution {
133+
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
134+
Deque<Integer> stk = new ArrayDeque<>();
135+
Map<Integer, Integer> m = new HashMap<>();
136+
for (int i = nums2.length - 1; i >= 0; --i) {
137+
while (!stk.isEmpty() && stk.peek() <= nums2[i]) {
138+
stk.pop();
139+
}
140+
if (!stk.isEmpty()) {
141+
m.put(nums2[i], stk.peek());
142+
}
143+
stk.push(nums2[i]);
144+
}
145+
int n = nums1.length;
146+
int[] ans = new int[n];
147+
for (int i = 0; i < n; ++i) {
148+
ans[i] = m.getOrDefault(nums1[i], -1);
149+
}
150+
return ans;
151+
}
152+
}
153+
```
154+
115155
### **JavaScript**
116156

117157
```js
@@ -133,6 +173,28 @@ var nextGreaterElement = function (nums1, nums2) {
133173
};
134174
```
135175

176+
```js
177+
/**
178+
* @param {number[]} nums1
179+
* @param {number[]} nums2
180+
* @return {number[]}
181+
*/
182+
var nextGreaterElement = function (nums1, nums2) {
183+
let stk = [];
184+
let m = {};
185+
for (let v of nums2.reverse()) {
186+
while (stk && stk[stk.length - 1] <= v) {
187+
stk.pop();
188+
}
189+
if (stk) {
190+
m[v] = stk[stk.length - 1];
191+
}
192+
stk.push(v);
193+
}
194+
return nums1.map(e => m[e] || -1);
195+
};
196+
```
197+
136198
### **C++**
137199

138200
```cpp
@@ -157,6 +219,25 @@ public:
157219
};
158220
```
159221
222+
```cpp
223+
class Solution {
224+
public:
225+
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
226+
stack<int> stk;
227+
unordered_map<int, int> m;
228+
for (int i = nums2.size() - 1; ~i; --i)
229+
{
230+
while (!stk.empty() && stk.top() <= nums2[i]) stk.pop();
231+
if (!stk.empty()) m[nums2[i]] = stk.top();
232+
stk.push(nums2[i]);
233+
}
234+
vector<int> ans;
235+
for (int& v : nums1) ans.push_back(m.count(v) ? m[v] : -1);
236+
return ans;
237+
}
238+
};
239+
```
240+
160241
### **Go**
161242

162243
```go
@@ -182,6 +263,31 @@ func nextGreaterElement(nums1 []int, nums2 []int) []int {
182263
}
183264
```
184265

266+
```go
267+
func nextGreaterElement(nums1 []int, nums2 []int) []int {
268+
stk := []int{}
269+
m := map[int]int{}
270+
for i := len(nums2) - 1; i >= 0; i-- {
271+
for len(stk) > 0 && stk[len(stk)-1] <= nums2[i] {
272+
stk = stk[:len(stk)-1]
273+
}
274+
if len(stk) > 0 {
275+
m[nums2[i]] = stk[len(stk)-1]
276+
}
277+
stk = append(stk, nums2[i])
278+
}
279+
var ans []int
280+
for _, v := range nums1 {
281+
val, ok := m[v]
282+
if !ok {
283+
val = -1
284+
}
285+
ans = append(ans, val)
286+
}
287+
return ans
288+
}
289+
```
290+
185291
### **TypeScript**
186292

187293
```ts

0 commit comments

Comments
 (0)