下一个更大元素 I

88 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

  • 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 。
  • 示例 2:
    • 输入: nums1 = [2,4], nums2 = [1,2,3,4].
    • 输出: [3,-1]
    • 解释:nums1 中每个值的下一个更大元素如下所述:
      • 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
      • 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
  • 提示
    • 1 <= nums1.length <= nums2.length <= 1000
    • 0 <= nums1[i], nums2[i] <= 104
    • nums1nums2中所有整数 互不相同
    • nums1 中的所有整数同样出现在 nums2 中

二、思路分析:

  • 暴力解法:首先双层循环找到nums1中每一项在nums2中的位置
  • 然后再次遍历nums2,遍历起始参数需要从上层找到的位置+1
  • 最后判断遍历的当前项是否大于nums1nums2的交集项
    • 找到一个符合条件的项,添加进定义好的数组变量中,并且退出当前循环
    • 没有找到符合条件的项,添加-1
  • 注意
    • 值得注意就是边界问题,即nums1中的数刚刚好在nums2的最后一个,这样右边就没有数,直接返回-1
    • break的使用,当找到后需要退出当前循环,避免做多余的循环操作

三、AC 代码:

function nextGreaterElement(nums1: number[], nums2: number[]): number[] {
    let ans: Array<number> = [];
    for(let i = 0; i < nums1.length; i++){
        for(let j = 0; j < nums2.length; j++){
            if(nums1[i] === nums2[j]){
                // 如果值刚好在nums2的最后一个,右边就没有值,添加-1
                if(j === nums2.length - 1){
                    ans.push(-1);
                    break;
                }
                for(let n = j + 1; n < nums2.length; n++){
                    if(nums2[j] <= nums2[n]){
                        ans.push(nums2[n]);
                        break;
                    }
                    // 如果找到最后一个都没有找到比他大的,添加-1
                    if(n === nums2.length - 1 && nums2[j] > nums2[n]){
                        ans.push(-1)
                    }
                }
            }
        }
    }
    return ans
};

四、总结:

  • 注意一下边界问题和break退出循环,就很容易解了
  • 更多解题方式,移步题解区

image.png