1 队列与堆排序知识
1)队列
队列是一种“先进先出”的数据结构or线性表,允许插入的一端称为队尾,允许删除的一段称为队头。
队列通常分为两种类型:顺序队列(采用顺序存储,当长度固定时使用)和链式队列(采用链式存储,长度不确定时使用)
队列两个基本操作:出队和入队。(参考博客及详细见:链接1)
简言之,队列是从队尾进入,队头出(有点像管道,一端入另一端出),因此容易实现“先进先出”。(若理解有误,望指出)
2)栈
栈是一种“先进后出(后进先出)”的数据结构or线性表,仅有一端进行插入和删除。
3)堆排序
堆是用数组实现的二叉树,根据“堆属性”来排序,因此“堆属性”决定了树中结点的位置。堆与普通二叉树又有所区别,具体见链接3
堆的两种形式(参考博客:链接2):
a)最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其他孩子的值大;
b)最小堆:根结点的键值是所有堆结点键值中的最小者,且每个结点的值都比其他孩子的值小。
堆排序思想:a)根据初始数组构造初始堆(构建一个完全二叉树,保证所有的父节点都比它的孩子结点数值大);
b)每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后将剩下元素重新调整为大根堆。
其中b):第一次交换R[0]和R[n],输出R[n],然后重新调整堆为最大堆,继续交换R[0]和R[n-1],输出R[n-1],以此反复直至交换了R[0]和R[1],输出R[1],最后输出R[0]。由此实现从大到小的排序。
例子:a)步骤:(图片及上述内容均来自链接2)
b)步骤:
2 hash table 和单链表回顾
hash table是根据关键码值(key value)而直接进行访问的数据结构;单链表是由一系列不连续的结点构成的链式存储结构,结点由存储数据元素的数据域和存放结点位置的指针域两部分构成。
3 leetcode # 239 Sliding Window Maximum
问题如图:
way 1 : solution demo
思路:1) 首先判断传入list是否为空,若为空直接返回list;若不为空转到2);
2) 判断滑窗大小k是否不大于list的长度,若否直接返回list最大值;若是转到3);
3) 设计循环,每一次循环内计算滑窗内最大值保存在k_max中,最后返回k_max;
实际上,此问题的测试中不会出现滑窗大小k大于list的情况,因此省略2)的判断。
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
if nums:
return [max(nums[i:i+k]) for i in range(len(nums)-k+1)]
else:
return nums
result:
(想不到怎么用队列的思想了~~~)
参考:
链接1:https://www.cnblogs.com/linuxAndMcu/p/7735444.html
链接2:https://www.cnblogs.com/jingmoxukong/p/4303826.html
链接3:https://www.jianshu.com/p/6b526aa481b1