在前面的文章中,我们提到了栈与队列的相关内容,这里举两个例子来展示一下其应用。
栈的应用
题目:由于天气原因,坤坤们的鸡温都有了一定的提高,请根据每天坤坤的鸡温表 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循环来依次遍历每个温度,时间复杂度为,采用栈的形式则可以将时间复杂度降到
。
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个数据的最大值,时间复杂度则为,如果采用队列,队列头部记录的是窗口中的最长背带裤下标,后面如果出现比其短的背带裤则加入其下标,然后遇到大的则从后往前依次删除,以确保最大的出列之后,下一个元素是最大的,其时间复杂度为
。这里我们就不展示常规做法了,用兴趣的小伙伴自行思考编写。
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))