本周主要是练习栈相关的题目
题目:
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x ****大的元素。
给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。
返回一个长度为 nums1.length 的数组 **ans **作为答案,满足 **ans[i] **是如上所述的 下一个更大元素 。
示例 1:
输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
提示:
1 <= nums1.length <= nums2.length <= 10000 <= nums1[i], nums2[i] <= 104nums1和nums2中所有整数 互不相同nums1中的所有整数同样出现在nums2中
🙇♂️ 感想:这道题使用暴力解法是很简单的。可能自己还是太肤浅,感觉暴力解法跟单调栈差不太多 🤣。暴力解法很简单,下面就主要是用单调栈的解法讲解,单调栈也是刚学会。有说错的,希望大佬指正一下。
🙇♂️ 解题思路: 本题使用单调栈的解题思路就是:先遍历nums2将nums2中所有元素的下一个更大找出来,这样nums1就基本可以直接拿到答案了。找出nums2中的下一个更大就是遍历nums2将值存入栈中,如果下一个值比栈顶元素大,则将元素弹出,存入哈希表中,知道栈中没有元素,或者栈顶中的元素比当前元素大,则结束栈元素中的判断,将当前值打入栈顶。以此循环
// 单调栈
function nextGreaterElement(nums1: number[], nums2: number[]): number[] {
let stack = []
let result = {}
for (let i = 0; i < nums2.length; i++) {
if (!stack.length) {
stack.push(nums2[i])
} else {
let pop = stack[stack.length - 1]
while (nums2[i] > pop && pop !== undefined) {
result[pop] = nums2[i]
stack.pop()
pop = stack[stack.length - 1]
}
stack.push(nums2[i])
// console.log(stack)
}
}
stack.forEach(item => {
result[item] = -1
})
let nums = []
nums1.forEach(item => {
nums.push(result[item])
})
return nums
};
// 暴力解法
let result: number[] = []
let i: number = 0
while(i < nums1.length) {
let j = nums2.findIndex(item => {
return item === nums1[i]
})
let flag = -1 // 找到否
while (j < nums2.length) {
if (nums2[j] > nums1[i]) {
flag = 1
result.push(nums2[j])
break
}
j++
}
if (flag === -1) {
result.push(-1)
}
i++
}
return result
// 暴力解法的时间复杂度是o(n²)