496. Next Greater Element I (Easy) (https://leetcode.com/problems/next-greater-element-i/)
Следующий больший элемент для некоторого элемента x в массиве — это первый больший элемент, находящийся справа от x в том же массиве. Даны два различных 0-индексированных целочисленных массива nums1 и nums2, где nums1 является подмножеством nums2. Для каждого 0 <= i < nums1.length найдите индекс j такой, что nums1[i] == nums2[j], и определите следующий больший элемент для nums2[j] в nums2. Если следующего большего элемента нет, ответом для этого запроса будет -1. Верните массив длины nums1.length такой, что ans[i] — это следующий больший элемент, как описано выше. Ограничения: - 1 <= nums1.length <= nums2.length <= 1000 - 0 <= nums1[i], nums2[i] <= 10^4 - Все целые числа в nums1 и nums2 уникальны.
- Все целые числа из nums1 также присутствуют в nums2. Дополнительный вопрос: Сможете ли вы найти решение с O(nums1.length + nums2.length)?
function nextGreaterElement(nums1: number[], nums2: number[]): number[] {
const stack: number[] = [] // LIFO; хранит числа, ещё не нашедшие next greater
const nextGreaters: Record<number, number> = {} // где ключ — число из nums2, значение — его next greater element
for (let i = 0; i < nums2.length; i++) {
const curr = nums2[i]
// При новом числе — пока оно больше вершины стека, выталкивай вершину и записывай в map map[вершина] = новое_число
while (curr > stack[stack.length - 1] && stack.length > 0) {
nextGreaters[stack.pop()!] = curr
}
stack.push(curr)
}
const result = []
for (let i = 0; i < nums1.length; i++) {
result.push(nextGreaters[nums1[i]] ?? -1)
}
return result
}
// Local check:
console.log(nextGreaterElement([4, 1, 2], [1, 3, 4, 2])) // [-1,3,-1]
console.log(nextGreaterElement([2, 4], [1, 2, 3, 4])) // [3,-1]Example 1:
Input: nums1 = [4,1,2], nums2 = [1,3,4,2]
Output: [-1,3,-1]
Explanation:
4 is in nums2 = [1,3,4,2]. There is no next greater element, so the answer is -1.
1 is in nums2 = [1,3,4,2]. The next greater element is 3.
2 is in nums2 = [1,3,4,2]. There is no next greater element, so the answer is -1.
Example 2:
Input: nums1 = [2,4], nums2 = [1,2,3,4]
Output: [3,-1]
Explanation:
2 is in nums2 = [1,2,3,4]. The next greater element is 3.
4 is in nums2 = [1,2,3,4]. There is no next greater element, so the answer is -1.