返回

20210306 LeetCode 每日一题,冲!|刷题打卡

前端

嗨,大家好,我是编程界的狂热爱好者,也是LeetCode的忠实粉丝。今天,我将带领大家一起解决LeetCode每日一题,并分享我的解题思路和经验。

今天的问题是503. 下一个更大元素 II。题目如下:

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的元素。如果不存在下一个更大的元素,那么输出 -1。

示例 1:

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的元素是 2;
数字 2 不存在下一个更大的元素;
第二个 1 的下一个更大的元素是 2。

示例 2:

输入: [1,2,3,4,3]
输出: [2,3,4,-1,4]
解释: 第一个 1 的下一个更大的元素是 2;
数字 2 的下一个更大的元素是 3;
数字 3 的下一个更大的元素是 4;
数字 4 不存在下一个更大的元素;
第二个 3 的下一个更大的元素是 4。

现在,让我们开始解决这个问题吧!

解题思路

这道题的关键在于理解“循环数组”的概念。循环数组意味着数组的最后一个元素的下一个元素是数组的第一个元素,以此类推。因此,在寻找下一个更大元素时,我们需要考虑数组的循环性。

我们可以使用一个栈来解决这个问题。栈是一种数据结构,它遵循后进先出的原则。我们将数组中的元素依次入栈,当我们遇到一个比栈顶元素更大的元素时,我们将栈顶元素弹出,并将其下一个更大的元素设置为当前元素。这样,我们就可以找到每个元素的下一个更大元素。

代码实现

def nextGreaterElements(nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    stack = []
    result = [-1] * len(nums)

    for i in range(len(nums) * 2):
        index = i % len(nums)
        while stack and nums[stack[-1]] < nums[index]:
            result[stack.pop()] = nums[index]
        stack.append(index)

    return result

时间复杂度

该算法的时间复杂度为 O(n),其中 n 是数组的长度。

空间复杂度

该算法的空间复杂度为 O(n),因为我们需要使用一个栈来存储元素。

总结

这道题是LeetCode中的一道经典题目,它考察了栈的数据结构和算法思想。通过解决这道题,我们可以加深对栈的理解,并提高我们的算法思维能力。

希望今天的解题分享对大家有所帮助。如果您有任何问题或建议,欢迎在评论区留言。让我们一起学习,共同进步!