Python每日一算法之“下一个更大的数”(列表模拟循环队列、栈)

问题描述:

给定一个环形数组,即最后一个元素的下一个元素是数组的第一个元素(类似数据结构中的循环队列),为每个元素打印下一个更大的元素。数字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]

猜你喜欢

转载自blog.csdn.net/qq_42642142/article/details/106114504