每日一题 -- 简单 -- 下一个更大元素(496)

113 阅读1分钟

本周主要是练习栈相关的题目

题目: 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 <= 1000
  • 0 <= nums1[i], nums2[i] <= 104
  • nums1nums2中所有整数 互不相同
  • 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²)