739. 每日温度
solution
public class Solution {
public int[] DailyTemperatures(int[] temperatures) {
int n = temperatures.Length;
int[] result = new int[n];
Stack<int> st = new Stack<int>();
st.Push(0);
for(int i = 1; i < n; i ++)
{
int j = st.Peek();
while(temperatures[i] > temperatures[j])
{
result[j] = i - j;
st.Pop();
if(st.Count == 0) break;
else j = st.Peek();
}
st.Push(i);
}
return result;
}
}
summary
错误:
将循环体内的while循环写成了条件判断
每次压入新元素要将所有小于新元素的元素全部弹出,保持栈顶到栈底单调递增
496. 下一个更大元素Ⅰ
题目:496. 下一个更大元素 I - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
solution
public class Solution {
public int[] NextGreaterElement(int[] nums1, int[] nums2) {
// 使用哈希表记录 nums2 中每个元素的下一个更大元素
Dictionary<int, int> map = new Dictionary<int, int>();
Stack<int> stack = new Stack<int>();
// 从右向左遍历 nums2
for (int i = nums2.Length - 1; i >= 0; i--) {
int num = nums2[i];
// 弹出栈顶元素,直到找到比 num 大的元素
while (stack.Count > 0 && stack.Peek() <= num) {
stack.Pop();
}
// 如果栈不为空,栈顶元素就是 num 的下一个更大元素
map[num] = stack.Count > 0 ? stack.Peek() : -1;
// 将当前元素入栈
stack.Push(num);
}
// 构建结果数组
int[] result = new int[nums1.Length];
for (int i = 0; i < nums1.Length; i++) {
result[i] = map[nums1[i]];
}
return result;
}
}
summary
5503.下一个更大元素Ⅱ
题目:503. 下一个更大元素 II - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
solution
public class Solution {
public int[] NextGreaterElements(int[] nums) {
int n = nums.Length;
int[] result = new int[n];
Stack<int> stack = new Stack<int>();
// 初始化结果数组为 -1
for (int i = 0; i < n; i++) {
result[i] = -1;
}
// 遍历两遍数组
for (int i = 0; i < 2 * n; i++) {
int num = nums[i % n];
while (stack.Count > 0 && nums[stack.Peek()] < num) {
result[stack.Pop()] = num;
}
if (i < n) {
stack.Push(i);
}
}
return result;
}
}
summary