详情

    需要注意的是,下一个的定义

    暴力破解,时间复杂度 O(mn),空间复杂度 O(1)

    1. func nextGreaterElement(nums1, nums2 []int) []int {
    2. m, n := len(nums1), len(nums2)
    3. res := make([]int, m)
    4. for i, num := range nums1 {
    5. j := 0
    6. for j < n && nums2[j] != num {
    7. j++
    8. }
    9. k := j + 1
    10. for k < n && nums2[k] < nums2[j] {
    11. k++
    12. }
    13. if k < n {
    14. res[i] = nums2[k]
    15. } else {
    16. res[i] = -1
    17. }
    18. }
    19. return res
    20. }

    单调栈+哈希表,时间复杂度 O(m+n),空间复杂度 O(n)
    算是一种逆向思维,nums1 是 nums2 的子集,所以可以先处理 nums2,处理出 nums2 中数字的下一个比它大的数字,然后在根据 nums1 去获取就行了

    func nextGreaterElement(nums1, nums2 []int) []int {
        mp := map[int]int{}
        stack := []int{}
        for i := len(nums2) - 1; i >= 0; i-- {
            num := nums2[i]
            for len(stack) > 0 && num >= stack[len(stack)-1] {
                stack = stack[:len(stack)-1]
            }
            if len(stack) > 0 {
                mp[num] = stack[len(stack)-1]
            } else {
                mp[num] = -1
            }
            stack = append(stack, num)
        }
        res := make([]int, len(nums1))
        for i, num := range nums1 {
            res[i] = mp[num]
        }
        return res
    }