问题描述:
给定一个环形数组,即最后一个元素的下一个元素是数组的第一个元素(类似数据结构中的循环队列),为每个元素打印下一个更大的元素。数字x的下一个更大的数,是遍历数组的过程中出现的第一个更大的数字,这意味着可以循环搜索以查找下一个更大的数字;如果它不存在,则为此数字输出-1。给定的数组长度不超过10000.
问题示例:
输入[1,2,1],输出[2,-1,2]。
代码实现:
方法1:模拟循环队列
class Solution:
def getNextBiggerNumber(self,L,res,Len):
for i in range(Len):
count = (i+1)%Len #取余,如果超过列表索引界限则回到0索引
while(count!= i): #寻找第一个大于该数的数
if L[count] > L[i]:
res.append(L[count])
break;
count =(count+1)%Len #防止出界,相当于循环至列表头了
else:#没有找到
res.append(-1)
if __name__ == '__main__':
mylist = [] #注意创建两个空列表可不要想C、C++那样mylist = res = [],会使两个指向同一个空列表
res = []
l = int(input("请输入数组长度:"))
if l <=10000:
mylist = [int(input("请输入元素:")) for x in range(l) ]
temp = Solution()
temp.getNextBiggerNumber(mylist,res,l)
print(res)
else:
print("error!")
方法2:利用栈
class Solution:
def getNextBiggerNumber(self,nums):
if not nums:
return [ ]
stack,res = [ ],[-1 for i in range(len(nums))]
for i in range(len(nums)):
if stack and nums[i] > nums[stack[-1]]:
while stack and nums[i] > nums[stack[-1]]:
pop_index = stack.pop()
res[pop_index] = nums[i]
stack.append(i)
for i in range(len(nums)):
if stack and nums[i] > nums[stack[-1]]:
while stack and nums[i] > nums[stack[-1]]:
pop_index = stack.pop()
res[pop_index] = nums[i]
stack.append(i)
if nums[stack[0]] == nums[stack[-1]]:
break
return res
if __name__ == '__main__':
mylist = []
res = []
l = int(input("请输入数组长度:"))
if l <=10000:
mylist = [int(input("请输入元素:")) for x in range(l) ]
temp = Solution()
res = temp.getNextBiggerNumber(mylist)
print(res)
else:
print("error!")
输出结果:
请输入数组长度:3
请输入元素:1
请输入元素:2
请输入元素:1
[2, -1, 2]
请输入数组长度:6
请输入元素:2
请输入元素:4
请输入元素:8
请输入元素:1
请输入元素:3
请输入元素:4
[4, 8, -1, 3, 4, 8]