栈与队列的应用

在前面的文章中,我们提到了栈与队列的相关内容,这里举两个例子来展示一下其应用。

栈的应用

        题目:由于天气原因,坤坤们的鸡温都有了一定的提高,请根据每天坤坤的鸡温表  temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的鸡温,至少需要等待的天数。如果鸡温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

输入: temperatures= [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

这里如果采用常规的方法,采用两个for循环来依次遍历每个温度,时间复杂度为O(n^{2}),采用栈的形式则可以将时间复杂度降到O(n)

class Solution_twofor:
    def dailyTemperatures(self, temperatures):
        n = len(temperatures)
        ans = [0]*n
        for i in range(n-1):
            for j in range(i+1,n):
                if temperatures[j]>temperatures[i]:
                    ans[i]=j-i
                    break
        return ans

class Solution_stack:
    def dailyTemperatures(self, temperatures):
        n = len(temperatures)
        ans = [0]*n
        stack = []
        for i in range(n):
            while stack and temperatures[stack[-1]]<temperatures[i]:
                ans[stack[-1]] = i-stack[-1]
                stack.pop()
            stack.append(i)
        return ans
#数据量较小时
temperatures = [73,74,75,71,69,72,76,73]
print(Solution_twofor().dailyTemperatures(temperatures))#[1, 1, 4, 2, 1, 1, 0, 0]
print(Solution_stack().dailyTemperatures(temperatures))#[1, 1, 4, 2, 1, 1, 0, 0]
import time
import random
temperatures = [random.randint(0,101) for i in range(50000)]
starttime1 = time.time()
res1 = Solution_twofor().dailyTemperatures(temperatures)
endtime1 = time.time()

starttime2 = time.time()
res2 = Solution_stack().dailyTemperatures(temperatures)
endtime2 = time.time()
print(endtime1-starttime1) #0.7420089244842529
print(endtime2-starttime2) #0.017000675201416016

我们可以发现,当数据量变大时,使用栈就可以极大地缩短计算时间。

队列的应用

        题目:给你一个整数数组 nums,表示坤坤所拥有的背带裤长度的排列,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大背带裤长度 

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

这里如果常规作法,依次从左到右滑动窗口,然后计算窗口中的k个数据的最大值,时间复杂度则为O(nk),如果采用队列,队列头部记录的是窗口中的最长背带裤下标,后面如果出现比其短的背带裤则加入其下标,然后遇到大的则从后往前依次删除,以确保最大的出列之后,下一个元素是最大的,其时间复杂度为O(n)。这里我们就不展示常规做法了,用兴趣的小伙伴自行思考编写。

class Solution:
    def maxSlidingWindow(self, nums, k):
        ans = []
        deq = []
        n = len(nums)
        for i in range(n):
            while deq and nums[deq[-1]]<=nums[i]:
                deq.pop()
            deq.append(i)
            if i-deq[0]>k-1:
                deq.pop(0)
            if i>=k-1:
                ans.append(nums[deq[0]])
        return ans
print(Solution().maxSlidingWindow(nums = [1,3,-1,-3,5,3,6,7], k = 3))

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值