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

你可能感兴趣的:(leetcode 503 下一个更大元素 II)