每天坚持刷题!!!
leetcode 503 下一个更大元素 II
题目描述:
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
题目分析:
看到题目第一想法就是暴力法喽,针对每一个元素往后找就好了,到数组末尾后继续从头找知道这个元素,但是这需要O(n^2)的时间,果断抛弃
具体分析下题目,要求的是找到下一个更大的元素,这意味着我们可以用一个栈来储存遍历的元素,具体是如果栈为空则push进元素,不为空则看元素和栈末尾的元素哪个大,如果元素比栈末尾的元素小则push进栈,否则只要栈末尾的元素比元素下就一直pop出来并设置pop出来的元素的第一个更大的元素就是被比较的元素即可。
最后为了方便遍历,把原数组 * 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