leetcode刷题(javaScript)——堆相关场景题总结

堆是什么?堆都能用树表示,并且一般树的实现都是利用链表。平时使用的最多的是二叉堆,它可以用完全二叉树表示,二叉堆易于存储,并且便于索引。在堆的实现时注意:因为是数组,所以父子节点的关系就不需要特殊的结构去维护了,索引之前通过计算就可以得到,省掉了很多麻烦,如果是链表结构,就会复杂很多。

在JavaScript刷题中,堆(Heap)通常用于解决一些需要高效处理优先级的问题,例如找出最大或最小的K个元素、实现优先队列等。堆在刷题中的应用场景包括但不限于以下几个方面:

  1. 找出最大或最小的K个元素:通过维护一个大小为K的最大堆或最小堆,可以快速找出数组中最大或最小的K个元素。

  2. 合并K个有序数组:可以使用堆来合并K个有序数组,实现高效的合并操作。

  3. 实现优先队列:堆可以用于实现优先队列,保证队列中优先级高的元素先出队。

 数组存储二叉堆

        二叉堆是一种完全二叉树,分为最小堆和最大堆两种类型。用数组存储二叉堆, 完全二叉树要求叶子节点从左往右填满,才能开始填充下一层。

  1. 二叉堆:二叉堆是一种完全二叉树,通常使用数组来表示。在最小堆中,父节点的值小于或等于其子节点的值;在最大堆中,父节点的值大于或等于其子节点的值。

  2. 最小堆:在最小堆中,父节点的值小于或等于其子节点的值。根节点是堆中的最小值。

  3. 最大堆:在最大堆中,父节点的值大于或等于其子节点的值。根节点是堆中的最大值。

注:完全二叉树和满二叉树不同,完全二叉树允许叶子节点不铺满。

动画演示创建堆的过程

 

同一组数据最小堆和最大堆是唯一的吗?

同一组数据的最小堆或最大堆不是唯一的。以最小堆为例:最小堆是一种特殊的二叉堆,它满足以下两个性质:

  1. 父节点的值小于或等于其子节点的值。
  2. 堆中任意节点的子树也是一个最小堆。

        由于最小堆只要满足上述性质即可,因此对于同一组数据,可以有多种不同的最小堆表示方式。这是因为在构建最小堆的过程中,可以选择不同的节点作为根节点,从而得到不同的堆结构。

所以,同一组数据的最小堆并不是唯一的,可以有多种不同的表示方式。

如何找到节点i父节点和子节点呢?

        二叉堆在数组是按层次遍历进行存储的,从上至下,从左至右。因此子节点的index要大于父节点的index。在二叉堆中,可以通过以下方式计算父节点和子节点的索引:

  • 父节点索引计算:对于节点i,其父节点的索引为(i-1)/2。
  • 左子节点索引计算:对于节点i,其左子节点的索引为2*i+1。
  • 右子节点索引计算:对于节点i,其右子节点的索引为2*i+2。

如何删除节点?

在删除一个元素之后,整体往前移动是比较费时的,这也是随机存储结构的短板。因此,堆在删除元素的时候是把最后一个叶子节点补充到树根节点。在通过节点移动将堆调整为最小堆或最大堆。

如何通过js构建最大堆

首先构造器得有吧,创建一个空的heap数组;

其次将获取父节点index、左右子节点index、堆大小size、栈顶元素获取、两节点交换这些简单的辅助函数写一下;

主函数insert插入节点:每次从heap的尾部也就是最后一个叶子节点插入,插进去的叶子节点得向上找它的位置吧,写一个up方法,找到插入节点位置;

up方法实现:找到节点的父元素,看父元素是否比自己小,如果小的换就交换,并且递归up方法,直到所有元素都调整好。

删除节点pop方法:这里依然将最后节点移到第一个跟节点,此时根节点一定是最小的,不符合最大堆规则,所以调整跟节点向下移动,写一个down方法移动根节点。这里注意堆的size如果等于1直接删除而不用移动节点。

down方法实现:找到根的左右子节点,选择比根大的节点进行交换,并递归down方法,直到所有节点都调整好。

交换节点swap可以使用数组解构进行交换,而不用单独定义中间值。

class MaxHeap {constructor() {this.heap = [];}//获取父元素下标getParentIndex(index) {return Math.floor((index - 1) / 2);}//获取左子树下标getLeftIndex(index) {return 2 * index + 1;}//获取右子树下标getRightIndex(index) {return 2 * index + 2;}//获取堆大小size() {return this.heap.length;}//获取堆顶元素peek() {return this.heap[0];}//交换节点swap(id1, id2) {[this.heap[id2], this.heap[id1]] = [this.heap[id1], this.heap[id2]];}//插入节点insert(value) {this.heap.push(value);this.up(this.size() - 1);}//删除节点pop() {let last = this.heap.pop();if (this.size() === 0) return;this.heap[0] = last;this.down(0);}//向上移动节点up(index) {const parentIndex = this.getParentIndex(index);if (this.heap[index] > this.heap[parentIndex]) {this.swap(parentIndex, index);this.up(parentIndex);}}//向下移动节点down(index) {const leftIndex = this.getLeftIndex(index);const rightIndex = this.getRightIndex(index);let smallIndex = index;if (leftIndex < this.size() &&this.heap[leftIndex] > this.heap[smallIndex]) {smallIndex = leftIndex;}if (rightIndex < this.size() &&this.heap[rightIndex] > this.heap[smallIndex]) {smallIndex = rightIndex;}if (smallIndex != index) {this.swap(smallIndex, index);this.down(smallIndex);}}
}

 这里让根节点从左右节点中与最小的节点进行交换。注意减少交换次数,避免多次递归

如何通过js构建最小堆

与创建最小堆类似。创建堆,往堆里新增元素,删除堆顶,获取堆的父节点下标,获取堆左右子节点下标

 代码示例

class MinHeap {constructor() {this.heap = [];}getParentIndex(index) {return Math.floor((index - 1) / 2);}getLeftIndex(index) {return index * 2 + 1;}getRightIndex(index) {return index * 2 + 2;}swap(i1, i2) {[this.heap[i1], this.heap[i2]] = [this.heap[i2], this.heap[i1]];}//往堆最后添加节点,触发元素上移//当前元素与其跟节点进行比较如果大于其跟节点与根节点进行交换,重复操作up(index) {//如果是0就不移动if (index == 0) return;//获取父元素const parentIndex = this.getParentIndex(index);if (this.heap[parentIndex] > this.heap[index]) {this.swap(parentIndex, index);//对交换后parentIndex继续向上递归this.up(parentIndex);}}//从堆顶删除元素时,将子节点移到堆顶,触发元素下移down(index) {const leftIndex = this.getLeftIndex(index);const rightIndex = this.getRightIndex(index);let smallIndex = index;//左子树小于根节点,交换左子树与根if (leftIndex < this.size() &&this.heap[leftIndex] < this.heap[smallIndex]) {smallIndex = leftIndex;}//同理,右子树小于根节点,交换右子树与根if (rightIndex < this.size() &&this.heap[rightIndex] < this.heap[smallIndex]) {smallIndex = rightIndex;}if (smallIndex != index) {this.swap(smallIndex, index);this.down(smallIndex);}}//往堆里增加元素insert(value) {this.heap.push(value);this.up(this.heap.length - 1);}//将堆顶元素弹出//删除节点pop() {let last = this.heap.pop();if (this.size() === 0) return;this.heap[0] = last;this.down(0);}//获取堆顶peek() {return this.heap[0];}//获取堆大小size() {return this.heap.length;}
}

 215. 数组中的第K个最大元素

解决数组中的第K个最大元素问题时,通常使用最小堆来实现。通过维护一个大小为K的最小堆,可以在O(NlogK)的时间复杂度内找到数组中的第K个最大元素。

但是题目最近新增了一个要求:就是必须让算法的时间复杂度控制在O(n),当K很大时使用堆有可能会超出时间复杂度,所以要减少不必要的交换移动。

直到今天(2024.3.14)使用堆排序仍然可以跑通全部案例。

注:官方给的快速选择,甚至是"三数取中"的方法来选择基准值也都无法达到时间复杂度,会在第40/41个案例卡住。

使用最小堆获取数组中第K个最大元素的思路:

  1. 初始化一个大小为K的最小堆:将数组中的前K个元素放入最小堆中。

  2. 遍历数组剩余元素:从第K+1个元素开始遍历数组,对于每个元素,如果大于最小堆的堆顶元素(堆中最小的元素),则将该元素加入最小堆,并移除堆顶元素。

  3. 返回堆顶元素:遍历完成后,最小堆的堆顶元素即为数组中的第K个最大元素。

使用最小堆的优势在于可以保持堆的大小为K,只需维护K个元素,避免了对整个数组进行排序或维护大堆的复杂度。

class MinHeap {constructor() {this.heap = [];}getParentIndex(index) {return Math.floor((index - 1) / 2);}getLeftIndex(index) {return index * 2 + 1;}getRightIndex(index) {return index * 2 + 2;}swap(i1, i2) {[this.heap[i1], this.heap[i2]] = [this.heap[i2], this.heap[i1]];}//往堆最后添加节点,触发元素上移//当前元素与其跟节点进行比较如果大于其跟节点与根节点进行交换,重复操作up(index) {//如果是0就不移动if (index == 0) return;//获取父元素const parentIndex = this.getParentIndex(index);if (this.heap[parentIndex] > this.heap[index]) {this.swap(parentIndex, index);//对交换后parentIndex继续向上递归this.up(parentIndex);}}//从堆顶删除元素时,将子节点移到堆顶,触发元素下移down(index) {const leftIndex = this.getLeftIndex(index);const rightIndex = this.getRightIndex(index);let smallIndex = index;//左子树小于根节点,交换左子树与根if (leftIndex < this.size() && this.heap[leftIndex] < this.heap[smallIndex]) {smallIndex = leftIndex;}//同理,右子树小于根节点,交换右子树与根if (rightIndex < this.size() && this.heap[rightIndex] < this.heap[smallIndex]) {smallIndex = rightIndex;}if (smallIndex != index) {this.swap(smallIndex, index);this.down(smallIndex);}}//往堆里增加元素insert(value) {this.heap.push(value);this.up(this.heap.length - 1);}//将堆顶元素弹出//删除节点pop() {let last = this.heap.pop();if (this.size() === 0) return;this.heap[0] = last;this.down(0);}//获取堆顶peek() {return this.heap[0];}//获取堆大小size() {return this.heap.length;}
}
// 寻找第 k 个最大的元素
var findKthLargest = function (nums, k) {let minHeap = new MinHeap();nums.forEach(item => {minHeap.insert(item);if (minHeap.size() > k) {//每次pop的是栈顶,及k+1个元素中最小的minHeap.pop();}})return minHeap.peek();
};

 算法可以通过全部的41个测试用例

 703. 数据流中的第 K 大元素

设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

请实现 KthLargest 类:

  • KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
  • int add(int val)val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

 思路:也是用最小堆来实现,最小堆前面已经介绍过堆的插入删除,直接将创建堆对象的类拿来用即可。

动态构建一个长度为k的最小堆,对顶即第k大的的元素。因为比k小的元素都被pop出去了

/*** @param {number} k* @param {number[]} nums*/
var KthLargest = function (k, nums) {//构建一个k个长度的最小堆this.k = k;this.minHeap = new MinHeap();// 初始化最小堆for (let num of nums) {this.add(num);}
};/** * @param {number} val* @return {number}*/
KthLargest.prototype.add = function (val) {this.minHeap.insert(val);while (this.minHeap.size() > this.k) {this.minHeap.pop();}return this.minHeap.peek();
};/*** Your KthLargest object will be instantiated and called as such:* var obj = new KthLargest(k, nums)* var param_1 = obj.add(val)*/
class MinHeap {constructor() {this.heap = [];}getParentIndex(index) {return Math.floor((index - 1) / 2);}getLeftIndex(index) {return index * 2 + 1;}getRightIndex(index) {return index * 2 + 2;}swap(i1, i2) {[this.heap[i1], this.heap[i2]] = [this.heap[i2], this.heap[i1]];}//往堆最后添加节点,触发元素上移//当前元素与其跟节点进行比较如果大于其跟节点与根节点进行交换,重复操作up(index) {//如果是0就不移动if (index == 0) return;//获取父元素const parentIndex = this.getParentIndex(index);if (this.heap[parentIndex] > this.heap[index]) {this.swap(parentIndex, index);//对交换后parentIndex继续向上递归this.up(parentIndex);}}//从堆顶删除元素时,将子节点移到堆顶,触发元素下移down(index) {const leftIndex = this.getLeftIndex(index);const rightIndex = this.getRightIndex(index);let smallIndex = index;//左子树小于根节点,交换左子树与根if (leftIndex < this.size() &&this.heap[leftIndex] < this.heap[smallIndex]) {smallIndex = leftIndex;}//同理,右子树小于根节点,交换右子树与根if (rightIndex < this.size() &&this.heap[rightIndex] < this.heap[smallIndex]) {smallIndex = rightIndex;}if (smallIndex != index) {this.swap(smallIndex, index);this.down(smallIndex);}}//往堆里增加元素insert(value) {this.heap.push(value);this.up(this.heap.length - 1);}//将堆顶元素弹出//删除节点pop() {let last = this.heap.pop();if (this.size() === 0) return;this.heap[0] = last;this.down(0);}//获取堆顶peek() {return this.heap[0];}//获取堆大小size() {return this.heap.length;}
}

 1046. 最后一块石头的重量

有一堆石头,每块石头的重量都是正整数。

每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x

最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0

 思想:构建一个最大堆,从堆顶取两个值分别为y,x判断如果y>x则将y-x放入堆中并将堆调整为最大堆。递归直到堆长度小于2。如果堆里还有值则返回堆顶元素,否则为0

/*** @param {number[]} stones* @return {number}*/
var lastStoneWeight = function (stones) {if (stones.length == 1) return stones[0];let maxHeap = new MaxHeap();stones.forEach((item) => maxHeap.insert(item));while (maxHeap.size() > 1) {let y = maxHeap.peek();maxHeap.pop();let x = maxHeap.peek();maxHeap.pop();if (y > x) {maxHeap.insert(y - x);}}return maxHeap.size() ? maxHeap.peek() : 0;
};
/*** @param {number[]} stones* @return {number}*/
var lastStoneWeight = function (stones) {if (stones.length == 1) return stones[0];let maxHeap = new MaxHeap();stones.forEach((item) => maxHeap.insert(item));while (maxHeap.size() > 1) {let y = maxHeap.peek();maxHeap.pop();let x = maxHeap.peek();maxHeap.pop();if (y > x) {maxHeap.insert(y - x);}}return maxHeap.size() ? maxHeap.peek() : 0;
};
class MaxHeap {constructor() {this.heap = [];}//获取父元素下标getParentIndex(index) {return Math.floor((index - 1) / 2);}//获取左子树下标getLeftIndex(index) {return 2 * index + 1;}//获取右子树下标getRightIndex(index) {return 2 * index + 2;}//获取堆大小size() {return this.heap.length;}//获取堆顶元素peek() {return this.heap[0];}//交换节点swap(id1, id2) {[this.heap[id2], this.heap[id1]] = [this.heap[id1], this.heap[id2]];}//插入节点insert(value) {this.heap.push(value);this.up(this.size() - 1);}//删除节点pop() {let last = this.heap.pop();if (this.size() === 0) return;this.heap[0] = last;this.down(0);}//向上移动节点up(index) {const parentIndex = this.getParentIndex(index);if (this.heap[index] > this.heap[parentIndex]) {this.swap(parentIndex, index);this.up(parentIndex);}}//向下移动节点down(index) {const leftIndex = this.getLeftIndex(index);const rightIndex = this.getRightIndex(index);let smallIndex = index;if (leftIndex < this.size() &&this.heap[leftIndex] > this.heap[smallIndex]) {smallIndex = leftIndex;}if (rightIndex < this.size() &&this.heap[rightIndex] > this.heap[smallIndex]) {smallIndex = rightIndex;}if (smallIndex != index) {this.swap(smallIndex, index);this.down(smallIndex);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生时期学习资源同步-1 第一学期结业考试题6

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载

C语言之文件操作(万字详解)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言 文件的打开和关闭 流和标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 fputc的使用 fgetc的使用 fput…

轮趣 IMU N100 九轴 IMU 在 ROS 下安装驱动

本篇介绍如何在ROS环境中使用 WHEELTEC N100 惯导模块。 轮趣 IMU N100 的 ROS 驱动程序下载链接&#xff1a;轮趣 IMU 资料 - 坚果云 - 云盘|网盘|企业网盘|同步|备份|无限空间|免费网络硬盘|企业云盘 1、CP2102 固定串口号 1.1 、修改串口号 在 Windows 中需要把 WHEELTE…

Nodejs 第五十四章(net)

net模块是Node.js的核心模块之一&#xff0c;它提供了用于创建基于网络的应用程序的API。net模块主要用于创建TCP服务器和TCP客户端&#xff0c;以及处理网络通信。 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;用于…

Linux系统Docker部署Plik系统结合内网穿透实现公网访问本地文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

支小蜜校园防霸凌系统都可以使用在哪些地方

校园防霸凌系统&#xff0c;作为一种有效的预防和干预工具&#xff0c;近年来在全球范围内受到越来越多的关注和应用。该系统综合运用现代科技手段&#xff0c;旨在识别、预防和应对校园内可能发生的霸凌行为&#xff0c;为师生提供一个安全、和谐的学习和生活环境。那么&#…

ArrayList 和 LinkedList 有什么区别?

1、典型回答 ArrayList 和 LinkedList 是 Java 中常用的集合类&#xff0c;它们都实现了 List 接口&#xff0c;如下图所示&#xff1a; 但二者有以下几点不同&#xff1a; 1、底层数据结构实现不同&#xff1a; ArrayList 底层使用数组实现&#xff0c;它通过一个可调整大小…

力扣热题100_矩阵_73_矩阵置零

文章目录 题目链接解题思路解题代码 题目链接 73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…

如何在Windows搭建WebDav服务,并外网可访问

目录 1. 安装IIS必要WebDav组件 2. 客户端测试 3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网 3.1 打开Web-UI管理界面 3.2 创建隧道 3.3 查看在线隧道列表 4. 公网远程访问 4.1 浏览器访问测试 4.2 映射本地盘符访问 4.3 安装Raidrive客户端 总结&…

STM32第九节(中级篇):RCC——时钟树讲解(第一节)

目录 前言 STM32第九节&#xff08;中级篇&#xff09;&#xff1a;RCC——时钟树讲解 时钟树主系统时钟讲解 HSE时钟 HSI时钟 锁相环时钟 系统时钟 SW位控制 HCLK时钟 PCLKI时钟 PCLK2时钟 RTC时钟 MCO时钟输出 6.2.7时钟安全系统(CSS&#xff09; 小结 前言 从…

2024Python二级

1. 2. 前序遍历首先访问根节点再访问左子树和右子树 3. 4. sub不属于保留字 5. 6. 7. 8. continue是再重新开始进行循环&#xff0c;不是题目中所规定字母的话就对它进行输出 9. Python没有主函数的说法 10. 未转化为数据所要求的形式&#xff0c;应首先考虑eval 11. l…

【unity接入SDK案例】从0到1 如何接入百度地图SDK到unity中【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

BUUCTF-Misc9

刷新过的图片1 1.打开附件 2.F5-steganography-master 利用F5-steganography-master工具 3.修改扩展名为压缩包 4.得到flag [BJDCTF2020]你猜我是个啥1 1.打开附件 是一个压缩包&#xff0c;但解压不了&#xff0c;不是压缩文件 2.010 Editor 用010 Editor查看&#xff0c;最…

Leet code 三步问题

解题思路&#xff1a;动态规划 先观察 1级台阶 1种方法 2级台阶 2种方法 3级台阶 4种方法 4级台阶 7种方法 5级台阶 13种方法 可以看出规律 从3级台阶后 每级台阶需要从前三层台阶和相加 注意&#xff1a;后面值会过大 需要在相加之后就模运算1000000007 代码如下 clas…

智慧路灯杆AI监测应用,让高速出行更安全

高速公路是现代交通出行的重要组成&#xff0c;高速公路上的交通安全也一直是人们关注的焦点。针对更好监测和管理高速公路上的交通状况&#xff0c;可以基于智慧路灯杆打造AI交通监测应用&#xff0c;通过智能感知高速路段的路况、车况、环境状况&#xff0c;实现实时风险感知…

轻松驾驭时间流:MYSQL日期与时间函数的实用技巧

​&#x1f308; 个人主页&#xff1a;danci_&#x1f525; 系列专栏&#xff1a;《MYSQL应用》&#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 MySQL的时间函数用于处理日期和时间数据。以下是一些常用的MySQL时间函数。 内容有点多&#xff0…

log4j2 burp插件-Log4j2Scan(二)

该工具为被动扫描Log4j2漏洞CVE-2021-44228的BurpSuite插件&#xff0c;具有多DNSLog&#xff08;后端&#xff09;平台支持&#xff0c;支持异步并发检测、内网检测、延迟检测等功能。 一、安装方法 建议使用BurpSuite 2020或以上更高版本&#xff0c;低版本BurpSuite未经严…

【idea】查看spring源代码没有注释

问题描述 点击类&#xff08;如&#xff1a;AnnotationConfigApplicationContext &#xff09;看到的没有注释 看到有&#xff1a; Decompiled .class file, bytecode version: 52.0 (java 8) 翻译过来是&#xff1a;解压.class文件&#xff0c;字节码版本&#xff1a;52.0…

【数据结构与算法】:插入排序与希尔排序

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏: 数据结构与算法 欢迎大家来到初阶数据结构的最后一小节&#xff1a;排序 目录 1.排序的基本概念与分类1.1什么是排序的稳定性&#xff1f;1.2内排序与外排序内排序外排序 2.插入排序2.1实现插入排序2.3稳定性…

Linux:kubernetes(k8s)Deployment的操作(13)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…