LeetCode-496-下一个更大元素

题目描述:

题目链接:LeetCode-496-下一个更大元素

解题思路:

方法一:暴力

方法二:单调栈
方法一代码实现:

java 复制代码
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        // 最笨的方法:暴力
        int len1= nums1.length;
        int len2= nums2.length;
        int[] res=new int[len1];
        Arrays.fill(res,-1);
        for (int i = 0; i < len1; i++) {
            for (int j = 0; j < len2; j++) {
                if (nums1[i]==nums2[j]){
                    for (int k = j; k <len2 ; k++) {
                        if (nums2[k]>nums2[j]){
                            res[i]=nums2[k];
                            break;// 找到之后一定要 break,不然会一直往后找,每次都是最后一个
                        }
                    }
                }
            }
        }
        return res;
    }

方法二代码实现:

  1. 先将nums1中的元素和下标都映射到map中,方便遍历nums2的时候查找
  2. 开始遍历nums2,存放的是下标,初始时将0放到stack中,开始判断栈口元素和当前元素的大小
    • 若 栈口元素 < 当前元素的大小,再判断栈是否为空,并且map中是否包含栈顶元素下标对应的索引,都有的话再更新res数组;
    • 若 栈口元素 = 当前元素的大小,直接入栈
    • 若 栈口元素 > 当前元素的大小,直接入栈
java 复制代码
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2= nums2.length;
        int[] res = new int[len1];// 初始化为-1
        Arrays.fill(res, -1);// 新学的方式,直接使用工具类,底层原理和自己写的效果是一样的
        Map<Integer, Integer> map = new HashMap<>();
        // 将nums1放到map中,目的是根据元素的数值可以找到其对应的下标
        for (int i = 0; i < len1; i++) {
            map.put(nums1[i], i);// <4,0>  <1,1>  <2,2>
        }
        Stack<Integer> stack = new Stack<>();// 单调栈遍历的是nums2
        stack.push(0);// 把nums2下标存进去
        for (int i = 1; i < nums2.length; i++) {
            // 如果 栈口元素 < 当前遍历元素: 收获结果,栈口元素出栈,再比较当前 栈口元素和 当前遍历元素的结果
            // 如果 栈口元素 = 当前遍历元素: 直接入栈
            // 如果 栈口元素 > 当前遍历元素: 直接入栈
            if (nums2[i] <= nums2[stack.peek()]) {// 保证是单调递增的栈
                stack.push(i);
            } else {
                // 持续判断的过程:先判断是否在map中
                while (!stack.isEmpty() && nums2[stack.peek()] < nums2[i]) {
                    if (map.containsKey(nums2[stack.peek()])) {
                        Integer index = map.get(nums2[stack.peek()]);
                        res[index] = nums2[i];
                    }
                    stack.pop();// 弹出栈顶元素
                }
                stack.add(i);// 都不满足就入栈
            }
        }
        return res;
    }
}
相关推荐
wfeqhfxz25887821 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
芝士爱知识a1 小时前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
Aaron15881 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
石去皿2 小时前
大模型面试通关指南:28道高频考题深度解析与实战要点
人工智能·python·面试·职场和发展
程序员辣条3 小时前
AI产品经理:2024年职场发展的新机遇
人工智能·学习·职场和发展·产品经理·大模型学习·大模型入门·大模型教程
AI大模型测试3 小时前
大龄程序员想转行到AI大模型,好转吗?
人工智能·深度学习·机器学习·ai·语言模型·职场和发展·大模型
美团程序员3 小时前
80道经典常见测试面试题
软件测试·面试·职场和发展·软件测试面试
sunguang20183 小时前
“懂不懂管理,一看便知”:做管理就是3件事,抓大、放小、管细做管理,其实就是要做好三件事:抓大、放小、管细。
经验分享·职场和发展
ProcessOn官方账号3 小时前
程序员如何与同龄人拉开差距?这5张让你快速提升认知,打开格局!
深度学习·职场和发展·学习方法
阿福赚美刀3 小时前
跨境电商公司如何高效培养新人:实战经验分享
职场和发展·电脑