原题链接
我的思路:
按stack的tag找到的这题,结果第一个AC的思路完全没有用到stack(orz
一个直观且简单且时间复杂度高的思路,三个for循环嵌套,很好理解,不多做解释了,最坏情况下的时间复杂度是O(n * m²) (其中n和m分别为nums1的长度和nums2的长度
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 j = 0; j < nums2.length; j++) {
if (nums2[j] == nums1[i]) {
for (int k = j; k < nums2.length; k++){
if (nums2[k] > nums2[j]) {
res[i] = nums2[k];
break;
}
}
break;
}
}
}
return res;
}
}
更好的解法:
一个??的(用了栈的)思路(就是那种评论都是why are you guys so smart的思路
首先总体来说这个方法是把nums2中所有的value的next greater element都找出来了。
最关键的步骤在于,遍历nums2中的每个element,对于每个element,如果它比栈顶值小,那么直接入栈,如果比栈顶值大,那么栈中所有元素都比这个element小,也就是栈中所有元素的next greater element都是这个element。题解中用了一个hashmap来存element和其next greater element的对应
(下面的code来自参考链接)
public int[] nextGreaterElement(int[] findNums, int[] nums) {
Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x
Stack<Integer> stack = new Stack<>();
for (int num : nums) {
while (!stack.isEmpty() && stack.peek() < num)
map.put(stack.pop(), num);
stack.push(num);
}
for (int i = 0; i < findNums.length; i++)
findNums[i] = map.getOrDefault(findNums[i], -1);
return findNums;
}
本文详细解析了LeetCode题目“下一个更大元素I”的两种解法。首先介绍了直观但效率较低的三重循环解决方案,时间复杂度为O(n*m²)。随后提出了一种更高效的方法,利用栈和哈希映射,将时间复杂度降低至O(n),并附带代码实现。
1020

被折叠的 条评论
为什么被折叠?



