• 136、LeetCode-496.下一个更大元素Ⅰ


    题目:

    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] 是如上所述的 下一个更大元素 。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/next-greater-element-i

    思路:

    单调栈可以在栈中存储下标;也可以存储数值

    本题使用单调栈按照每日温度的方式处理nums2的数据;nums1的值都能在nums2中找到

    使用哈希表存储num1的数值和下标,可以在O(1)的时间复杂度中按照数值找到下标进行结果数组的更新;

    主体是nums2;nums1看似是主要的,其实只是确定下标位置

    代码:

    1)暴力解法:时间复杂度为O(N^2)

    1. class Solution {
    2. public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    3. int len = nums1.length;
    4. int[] res = new int[len];//作为结果集返回
    5. for(int i = 0;i < len;i++){
    6. res[i] = -1;//先赋值为-1
    7. }
    8. for(int i = 0;i < len;i++){
    9. for(int j = 0;j < nums2.length;j++){
    10. if(nums1[i] == nums2[j]){
    11. j++;//先j++往后移动一位
    12. while(j < nums2.length && nums2[j] < nums1[i]){
    13. j++;
    14. }
    15. if(j >= nums2.length) break;
    16. else if(j < nums2.length && nums2[j] > nums1[i]){
    17. res[i] = nums2[j];//更新之后不用继续!
    18. break;
    19. }
    20. }
    21. }
    22. }
    23. return res;
    24. }
    25. }

    2)单调栈 + 哈希表

    1. class Solution {
    2. public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    3. //单调栈 + map;存到map里是为了在O(1)的时间复杂度中找到;
    4. //整体的逻辑还是在nums2中,只是结果要更新在nums1中
    5. int l1 = nums1.length;
    6. int l2 = nums2.length;
    7. int[] res = new int[l1];//结果数组
    8. Arrays.fill(res,-1);
    9. Stack stack = new Stack<>();//构造单调栈
    10. HashMap map = new HashMap<>();
    11. for(int i = 0;i < l1;i++){
    12. map.put(nums1[i],i);//为了O1时间复杂度找到下标
    13. }
    14. //所有的元素都必然入了一次栈
    15. for(int i = 0;i < l2;i++){
    16. while(!stack.isEmpty() && nums2[i] > stack.peek()){
    17. int num = stack.pop();
    18. if(map.containsKey(num)){
    19. res[map.get(num)] = nums2[i];
    20. }
    21. }
    22. stack.push(nums2[i]);
    23. }
    24. return res;
    25. }
    26. }

  • 相关阅读:
    Python 自动化脚本系列:第3集
    ASEMI肖特基二极管MBR20200CT参数及代换
    如何将base64图片转化为URL格式
    并发、线程简单理解
    iOS Facebook SDK 安装
    ios safari 正则兼容问题
    Linux文件系统 struct file 结构体解析
    [ChatGPT] 从 GPT-3.5 到 GPT-5 的进化之路 | ChatGPT和程序员 : 协作 or 取代
    剑指 Offer 63. 股票的最大利润(JAVA)
    c#调用c++生成的dll,c++端使用opencv, c#端使用OpenCvSharp, 返回一张图像
  • 原文地址:https://blog.csdn.net/weixin_54532276/article/details/126767779