我的题解
思想:暴力
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] res = new int[nums1.length];
for(int i = 0; i < nums1.length; i++){
int j = 0;
while(j < nums2.length && nums1[i] != nums2[j]){
j++;
}
for(int k = j; k < nums2.length; k++){
if(nums2[k] > nums1[i]){
res[i] = nums2[k];
break;
}
if(k == nums2.length - 1 && nums2[k] <= nums1[i]){
res[i] = -1;
}
}
}
return res;
}
}
优秀题解(回顾)
思想:单调栈
class Solution {
// 定义一个名为Solution的类
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
// 定义一个公共方法nextGreaterElement,接受两个整数数组nums1和nums2作为参数,并返回一个整数数组
HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>();
// 创建一个HashMap,用于存储数组nums1中每个元素的值及其索引
for(int i = 0; i < nums1.length; i++){
// 遍历数组nums1
hash.put(nums1[i], i);
// 将当前元素及其索引存入HashMap中
}
int[] res = new int[nums1.length];
// 创建一个整数数组res,长度与nums1相同,用于存储结果
Arrays.fill(res, -1);
// 使用-1填充数组res,表示默认情况下没有找到更大的元素
Stack<Integer> stack = new Stack<Integer>();
// 创建一个栈,用于在遍历nums2时存储元素的索引
for(int i = 0; i < nums2.length; i++){
// 遍历数组nums2
while(!stack.isEmpty() && nums2[stack.peek()] < nums2[i]){
// 当栈不为空,并且栈顶元素对应的nums2中的值小于当前元素时,执行循环
int pre = nums2[stack.pop()];
// 弹出栈顶元素,并将其对应的nums2中的值赋给变量pre
if (hash.containsKey(pre)) {
// 如果HashMap中包含pre,说明它是nums1中的元素
res[hash.get(pre)] = nums2[i];
// 将nums2中当前元素的值设置为nums1中pre元素对应的下一个更大元素
}
}
stack.add(i);
// 将当前元素的索引压入栈中
}
return res;
// 返回结果数组res
}
}