LeetCode:739. 每日温度
1.思路
自定义一个栈空间存储数组索引,将大于当前索引的数值时,计算索引差值,栈顶元素弹出,循环此步骤,直到:小于等于当前索引数值时,将当前索引加入栈中。
2.代码实现
// 超时 // 暴力解法:两层for循环,一层定义起始位置,一层定义终止位置。终止的情况有两种:一个是遇到大于当前节点的值,一个遍历到结尾没有遇到大于当前节点的值,使用一个局部变量和一个标识符标记即可 class Solution { public int[] dailyTemperatures(int[] temperatures) { int[] answer = new int[temperatures.length]; for (int i = 0; i < temperatures.length; i++) { int res = 0; boolean flag = false; for (int j = i; j < temperatures.length; j++) { if (temperatures[j] > temperatures[i]) { answer[i] = res; flag = true; break; } res++; } if (!flag) { answer[i] = 0; } } return answer; } } // 单调栈 class Solution { public int[] dailyTemperatures(int[] temperatures) { Stack<Integer> stack = new Stack<>(); // 存储数组索引 stack.push(0); int[] res = new int[temperatures.length]; for (int i = 1; i < temperatures.length; i++) { if (temperatures[i] <= temperatures[stack.peek()]) { stack.push(i); } else { while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) { res[stack.peek()] = i - stack.peek(); stack.pop(); } stack.push(i); // 如果符合单调递增,则加入栈 } } return res; } }
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(n).
LeetCode:496.下一个更大元素 I
1.思路
将数组1中的元素映射到map中,对数组2进行遍历构造单调栈,当前元素小于栈顶元素时,入栈即可。当前元素大于栈顶元素时进行判断栈顶元素是否存在map中,对其进行循环判断,如果存在则将当前元素加入到和数组1值相同的索引下的结果集中。
2.代码实现
// 单调栈 class Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { Stack<Integer> stack = new Stack<>(); int[] res = new int[nums1.length]; Arrays.fill(res, -1); Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums1.length; i++) { map.put(nums1[i], i); } stack.add(0); for (int i = 1; i < nums2.length; i++) { if (nums2[i] <= stack.peek()) { stack.add(i); } else { while (!stack.isEmpty() && nums2[i] > nums2[stack.peek()]) { if (map.containsKey(nums2[stack.peek()])) { int idx = map.get(nums2[stack.peek()]); res[idx] = nums2[i]; } // stack.pop(); } stack.add(i); } } return res; } } // 暴力解法:ac class Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { int[] res = new int[nums1.length]; for (int i = 0; i < nums1.length; i++) { res[i] = -1; } for (int i = 0; i < nums1.length; i++) { for (int j = 0; j < nums2.length; j++) { if (nums1[i] == nums2[j]) { for (int k = j + 1; k < nums2.length; k++) { if (nums2[k] > nums2[j]) { res[i] = nums2[k]; break; } } break; } } } return res; } }
3.复杂度分析
时间复杂度:O(n^2).
空间复杂度:O(n).