leetcode 503 下一个更大元素 II

每天坚持刷题!!!

leetcode 503 下一个更大元素 II

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

题目分析:

  1. 看到题目第一想法就是暴力法喽,针对每一个元素往后找就好了,到数组末尾后继续从头找知道这个元素,但是这需要O(n^2)的时间,果断抛弃

  2. 具体分析下题目,要求的是找到下一个更大的元素,这意味着我们可以用一个栈来储存遍历的元素,具体是如果栈为空则push进元素,不为空则看元素和栈末尾的元素哪个大,如果元素比栈末尾的元素小则push进栈,否则只要栈末尾的元素比元素下就一直pop出来并设置pop出来的元素的第一个更大的元素就是被比较的元素即可。

  3. 最后为了方便遍历,把原数组 * 2拼接下就可以简单实现循环查找了

def nextGreaterElements(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        if not nums:
            return []
        if len(nums) == 1:
            return [-1]
        result = [-1 for _ in nums]
        temp = []
        length = len(nums)
        nums = nums * 2
        for i in xrange(len(nums)):
            if not temp:
                temp.append((nums[i], i))
                continue
            if nums[i] > temp[-1][0]:
                while temp and temp[-1][0] < nums[i]:
                    poped = temp.pop()
                    tt = poped[1] - length if poped[1] >= length else poped[1]
                    result[tt] = nums[i]
            temp.append((nums[i], i))
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值