LeetCode算法题-Next Greater Element I(Java实现)

这是悦乐书的第244次更新,第257篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第111题(顺位题号是496)。你有两个数组(没有重复)nums1和nums2,其中nums1的元素是nums2的子集。在nums2的相应位置找到nums1元素的所有下一个更大的数字。nums1中的数字x的下一个更大数字是nums2中右边第一个更大的数字。如果它不存在,则输出该数字的-1。例如:

输入:nums1 = [4,1,2],nums2 = [1,3,4,2]。

输出:[-1,3,-1]

说明:对于第一个数组中的数字4,在第二个数组中找不到下一个更大的数字,因此输出-1。对于第一个数组中的数字1,第二个数组中的下一个更大数字是3。对于第一个数组中的数字2,第二个数组中没有下一个更大的数字,因此输出-1。

输入:nums1 = [2,4],nums2 = [1,2,3,4]。

输出:[3,-1]

说明:对于第一个数组中的数字2,第二个数组中的下一个更大数字是3。对于第一个数组中的数字4,第二个数组中没有下一个更大的数字,因此输出-1。

注意:

  • nums1和nums2中的所有元素都是唯一的。
  • nums1和nums2的长度不会超过1000。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

暴力解法。使用两层循环,先找到nums1的元素在nums2中的对应元素,然后从nums2中找到的元素的下一位往右开始判断,找到比当前元素大的元素,找得到就将其作为结果数组的元素添加进去,否则就将-1添加进结果数组。

public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    int[] result = new int[nums1.length];
    for (int i=0; i<nums1.length; i++) {
        int j = 0, k = 0;
        for (; j<nums2.length; j++) {
            if (nums1[i] == nums2[j]) {
                break;
            }
        }
        for (k = j+1; k<nums2.length; k++) {
            if (nums2[k] > nums2[j]) {
                result[i] = nums2[k];
                break;
            }
        }
        if (k == nums2.length) {
            result[i] = -1;
        }
    }
    return result;
}

03 第二种解法

我们可以将第一种方法进行优化,将nums2中的元素作为key、索引作为value存入HashMap,在原来第一种解法中每次通过循环来定位nums2中的索引位置,换成了通过key查找value的映射,获取到索引后,从索引后一位开始依次寻找比nums1的当前元素大的数字,找得到就替换已经设值为-1的结果数组的元素值。

public int[] nextGreaterElement2(int[] nums1, int[] nums2) {
    int[] result = new int[nums1.length];
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i=0; i<nums2.length; i++) {
        map.put(nums2[i], i);
    }
    for (int j=0; j<nums1.length; j++) {
        result[j] = -1;
        int index = map.get(nums1[j]);
        for (int k = index + 1; k<nums2.length; k++) {
            if (nums2[k] > nums1[j]) {
                result[j] = nums2[k];
                break;
            }
        }
    }
    return result;
}

04 第三种解法

使用HashMap和栈。在第二种解法中我们使用HashMap存的是nums2的值、索引,在此解法中,我们使用HashMap存的是,如果nums2的当前元素存在右边最大数,上一个元素为key,当前元素为value。

在遍历nums2中的元素时,如果栈不为空,并且当前栈顶的值小于当前元素,即nums2的前一个元素存在右边最大数,此时,我们需要将栈顶的元素作为key,当前元素作为value,存入HashMap中,同时,要将栈顶的元素移除,此操作是循环执行的。最后我们再将nums2的当前元素存入stack中。

接着,我们要开始处理nums1的数据了,遍历其中的元素,如果能够在HashMap中找到对应的值,就取其value作为结果数组的元素值,否则取-1作为默认值。

public int[] nextGreaterElement3(int[] nums1, int[] nums2) {
    int[] result = new int[nums1.length];
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    Stack<Integer> stack = new Stack<Integer>();
    for (int num : nums2) {
        while (!stack.isEmpty() && stack.peek() < num) {
            map.put(stack.pop(), num);
        }
        stack.push(num);
    }
    for (int i=0; i<nums1.length; i++) {
        result[i] = map.getOrDefault(nums1[i], -1);
    }
    return result;
}

05 小结

算法专题目前已日更超过三个月,算法题文章111+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

原文地址:https://www.cnblogs.com/xiaochuan94/p/10336240.html

时间: 2024-07-31 12:34:52

LeetCode算法题-Next Greater Element I(Java实现)的相关文章

LeetCode算法题-Kth Largest Element in a Stream(Java实现)

这是悦乐书的第296次更新,第315篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第164题(顺位题号是703).设计一个类来查找流中第k个最大元素.请注意,它是排序顺序中的第k个最大元素,而不是第k个不同元素.KthLargest类有一个构造方法,此构造方法有一个整数k和一个整数数组nums两个参数,它包含来自流的初始元素.对于方法KthLargest.add的每次调用,返回表示流中第k个最大元素的元素.例如: int k = 3; int [] arr = [4

LeetCode算法题-Merge Sorted Array(Java实现)

这是悦乐书的第161次更新,第163篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第20题(顺位题号是88).给定两个排序的整数数组nums1和nums2,将nums2中的元素合并到nums1中,并且作为一个排序的数组.在nums1和nums2中初始化的元素个数分别为m和n.假设nums1有足够的空间(大于或等于m + n)来保存nums2中的其他元素.例如: 输入:nums1 = [1,2,3,0,0,0],m = 3,nums2 = [2,5,6],n = 3

LeetCode算法题-Power Of Two(Java实现)

这是悦乐书的第194次更新,第200篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231).给定一个整数,写一个函数来确定它是否是2的幂.例如: 输入:1 输出:true 说明:2^0 = 1 输入:16 输出:true 说明:2^4 = 16 输入:218 输出:false 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 此解法是做乘法,新建一个变量,

LeetCode算法题-First Bad Version(Java实现-三种解法)

这是悦乐书的第200次更新,第210篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第66题(顺位题号是278).您是产品经理,目前领导团队开发新产品.不幸的是,您产品的最新版本未通过质量检查.由于每个版本都是基于以前的版本开发的,因此坏版本之后的所有版本也是坏的. 假设您有n个版本[1,2,...,n]并且您想找出第一个坏的版本,这会导致以下所有版本都不好.您将获得一个API bool isBadVersion(版本),它将返回版本是否错误. 实现一个函数来查找第一

LeetCode算法题-Power of Four(Java实现-六种解法)

这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4的幂.例如: 输入:16 输出:true 输入:5 输出:false 跟进:你可以在没有循环/递归的情况下解决它吗? 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 特殊情况:当num小于等于1时,直接返回

LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形,则返回True,否则返回False.例如: 输入:16 输出:true 输入:14 输出:false 注意:不要使用任何内置库函数,例如sqrt. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 暴力解法

LeetCode算法题-Find the Difference(Java实现-五种解法)

这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混洗字符串s生成,然后在随机位置再添加一个字母.找到t中添加的字母.例如: 输入:s ="abcd", t ="abcde" 输出:'e' 说明:'e'是添加的字母. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Jav

LeetCode算法题-License Key Formatting(Java实现)

这是悦乐书的第241次更新,第254篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第108题(顺位题号是482).您将获得一个表示为字符串S的许可证密钥,该字符串仅包含字母数字字符和短划线.该字符串被N个破折号分成N + 1个组. 给定数字K,我们希望重新格式化字符串,使得每个组包含正好的K个字符,但第一个组可能比K短,但仍然必须包含至少一个字符.此外,必须在两个组之间插入短划线,并且所有小写字母都应转换为大写.给定非空字符串S和数字K,根据上述规则格式化字符串.例

LeetCode算法题-Construct the Rectangle(Java实现)

这是悦乐书的第243次更新,第256篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第110题(顺位题号是492).对于Web开发人员,了解如何设计网页的大小非常重要.因此,给定一个特定的矩形网页区域,您现在的工作是设计一个矩形网页,其长度L和宽度W满足以下要求: 1.您设计的矩形网页区域必须等于给定的目标区域. 2.宽度W不应大于长度L,这意味着L> = W. 3.长度L和宽度W之间的差异应尽可能小. 您需要按顺序输出您设计的网页的长度L和宽度W. 例: 输入:4