代码随想录-Day36

452. 用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

示例 1:

输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8]和[1,6]。
-在x = 11处发射箭,击破气球[10,16]和[7,12]。
示例 2:

输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4
解释:每个气球需要射出一支箭,总共需要4支箭。
示例 3:

输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2
解释:气球可以用2支箭来爆破:

  • 在x = 2处发射箭,击破气球[1,2]和[2,3]。
  • 在x = 4处射出箭,击破气球[3,4]和[4,5]。
    在这里插入图片描述
/*** 时间复杂度 : O(NlogN)  排序需要 O(NlogN) 的复杂度* 空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间*/
class Solution {public int findMinArrowShots(int[][] points) {// 根据气球直径的开始坐标从小到大排序// 使用Integer内置比较方法,不会溢出Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));int count = 1;  // points 不为空至少需要一支箭for (int i = 1; i < points.length; i++) {if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=count++; // 需要一支箭} else {  // 气球i和气球i-1挨着points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界}}return count;}
}

这段Java代码是解决“最少箭矢引爆气球”问题的一个实现。给定一个二维数组 points,其中 points[i] = [start_i, end_i] 表示第 i 个气球的起始和结束坐标,该函数的目标是找到射箭的最小数目,使得每个气球都被射中。气球被一支箭射中当且仅当这根箭可以从气球的起始坐标贯穿到结束坐标(即 start_i <= end_i 的情况)。请注意,箭在坐标轴上沿水平方向飞行。

代码解析:

  1. 排序:首先使用 Arrays.sort() 方法对 points 数组按照气球的起始坐标进行升序排序。这样做的目的是便于后续遍历中判断气球间的重叠关系。排序的时间复杂度是O(NlogN),其中N是气球的数量。

  2. 初始化计数器:初始化一个 count 变量为1,表示至少需要一支箭来射击气球。

  3. 遍历气球:从第二个气球开始遍历,比较当前气球(记为 i)的起始坐标与前一个气球(记为 i-1)的结束坐标。如果当前气球的起始坐标大于前一个气球的结束坐标,说明这两个气球不重叠,需要额外的一支箭,此时将 count 自增1。反之,如果气球重叠,则更新当前气球的结束坐标为两气球结束坐标中较小的一个,表示即使使用较少的箭也能覆盖这两个重叠的气球。

  4. 返回结果:遍历完成后,返回 count 作为最少需要的箭的数量。

复杂度分析:

  • 时间复杂度:O(NlogN),主要来自排序操作。
  • 空间复杂度:O(logN),这是Java内置排序函数(通常是快速排序)所需的栈空间。

总结:

该算法通过排序和一次遍历来识别可以被同一支箭射中的气球组,确保了使用最少的箭数。这是一种贪心策略,因为它在每一步都做出局部最优的选择(合并重叠的气球),从而达到全局最优解。

435. 无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:

输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
在这里插入图片描述

方法一:

class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (a,b)-> {return Integer.compare(a[0],b[0]);});int count = 1;for(int i = 1;i < intervals.length;i++){if(intervals[i][0] < intervals[i-1][1]){intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]);continue;}else{count++;}    }return intervals.length - count;}
}

这段Java代码是解决“移除最少区间数使剩余区间无重叠”问题的一个实现。给定一个区间的集合 intervals,其中 intervals[i] = [starti, endi],该函数的目标是移除最少数量的区间,使得剩余区间之间互不重叠。返回需要移除的区间数量。

代码解析:

  1. 排序:首先使用 Arrays.sort() 方法对 intervals 数组按照区间的起始坐标进行升序排序。这样排序的目的是便于后续遍历中判断区间是否重叠。排序依据是区间的起始点,如果起始点相同,则默认维持原顺序。

  2. 初始化计数器:初始化一个 count 变量为1,表示至少有一个区间是不会被移除的(排序后第一个区间)。

  3. 遍历区间:从第二个区间开始遍历,比较当前区间(记为 i)的起始坐标与前一个区间(记为 i-1)的结束坐标。如果当前区间的起始坐标小于前一个区间的结束坐标,说明这两个区间重叠。此时,我们选择保留结束时间较早的区间(即更新当前区间的结束时间为两个区间结束时间的较小者),并继续检查下一个区间,不增加计数器 count。这是因为通过调整保留区间的结束时间,我们实际上是在尝试通过移除当前区间来消除重叠,但并不直接增加已选择区间(无重叠)的计数。如果当前区间与前一个区间不重叠,则增加 count,表示找到了一个新的无须移除的区间。

  4. 计算并返回结果:遍历结束后,intervals.length - count 即为需要移除的区间数量,因为总区间数减去不需要移除的区间数(即无重叠的区间数)即为需要移除的区间数。

复杂度分析:

  • 时间复杂度:O(NlogN),其中N是区间数量,主要来自于排序操作。
  • 空间复杂度:O(1),除了输入和输出外,我们只用了常数级别的额外空间。

总结:

该算法通过排序和一次遍历来决定哪些区间可以保留以最小化移除数量,采用了贪心策略来逐步构建无重叠的区间集合。

方法二:

class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (a,b)-> {return Integer.compare(a[0],b[0]);});int remove = 0;int pre = intervals[0][1];for(int i = 1; i < intervals.length; i++) {if(pre > intervals[i][0]) {remove++;pre = Math.min(pre, intervals[i][1]);}else pre = intervals[i][1];}return remove;}
}

这段Java代码是解决“移除最少区间数使剩余区间无重叠”问题的另一种实现。给定一个区间集合 intervals,其中 intervals[i] = [starti, endi],该函数的目标是最小化需要移除的区间数量,以便剩下的区间没有重叠。返回需要移除的区间数量。

代码解析:

  1. 排序:首先使用 Arrays.sort() 方法对 intervals 数组按照区间的起始坐标进行升序排序。这样可以确保我们从最早开始的区间开始考虑,有助于减少重叠的可能性。

  2. 初始化:初始化 remove 变量为0,表示需要移除的区间数初值为0。pre 变量记录上一个区间(目前考虑的区间)的结束时间,初始化为排序后第一个区间的结束时间。

  3. 遍历区间:从第二个区间开始遍历(因为 pre 已经存储了第一个区间的结束时间),对于每个区间 i

    • 如果当前区间的起始时间 intervals[i][0] 小于前一个区间(记为 i-1)的结束时间 pre,说明这两个区间重叠。此时,需要移除一个区间以消除重叠。为了决定保留哪个区间,我们取两者结束时间的较小值更新 pre,因为这样可以留出更多空间给之后的区间,有可能减少未来的移除。同时,remove 计数器加1。
    • 如果没有重叠(即 pre <= intervals[i][0]),则更新 pre 为当前区间的结束时间,继续检查下一个区间,无需增加 remove 计数。
  4. 返回结果:遍历结束后,返回 remove,即为需要移除的区间数量,以使得剩下的区间无重叠。

复杂度分析:

  • 时间复杂度:O(NlogN),其中N是区间数量,主要来自于排序操作。
  • 空间复杂度:O(1),除了输入数组外,只使用了常数级别的额外空间。

总结:

该算法同样采取了贪心策略,通过排序和单次遍历确定最少需要移除的区间数,以确保剩余区间无重叠。与前一版本相比,这里的实现更加直接地体现了冲突发生时的选择逻辑(直接在判断中更新pre和增加remove计数),并且清晰地展示了如何通过选择重叠区间中结束更早的那个来优化解。

763.划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

示例 1:
输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。
示例 2:

输入:s = “eccbbbbdec”
输出:[10]
在这里插入图片描述

方法一:

class Solution {public List<Integer> partitionLabels(String S) {List<Integer> list = new LinkedList<>();int[] edge = new int[26];char[] chars = S.toCharArray();for (int i = 0; i < chars.length; i++) {edge[chars[i] - 'a'] = i;}int idx = 0;int last = -1;for (int i = 0; i < chars.length; i++) {idx = Math.max(idx,edge[chars[i] - 'a']);if (i == idx) {list.add(i - last);last = i;}}return list;}
}

这段Java代码是一个解决字符串划分问题的实现,具体问题是:“给定一个字符串S,将S分割成一些子串,使每个子串都是一个回文串(正读反读都一样),且返回符合要求的最小子串数量。”然而,根据代码逻辑,实际解决的问题与上述描述不符,实际上该代码实现的功能是:

功能描述:给定一个字符串 S,将其划分为一些子串,要求同一个字母组成的子串必须划分在一起,且划分出的子串之间不能交错。例如,字符串 “ababcbacadefegdehijhklij” 应划分为 [“ababcbaca”, “defegde”, “hijhklij”]。该函数返回每个子串的长度组成的列表。

代码解析:

  1. 初始化:创建一个 List<Integer> 类型的结果列表 list 用于存放子串长度,以及一个长度为26的整型数组 edge 来记录每个字母最后一次出现的位置。初始化 idx 为0(用于记录当前子串的右边界),last 为-1(用于记录上一个子串的右边界)。

  2. 记录每个字符的最远边界:遍历字符串 S 的每个字符,利用 edge 数组记录每个字符最后出现的位置。

  3. 遍历并划分子串:再次遍历 S,这次通过比较当前字符的最远边界 edge[chars[i] - 'a'] 和当前子串右边界 idx,更新 idx 为两者的较大值。这一步确保了 idx 总是指向当前子串(根据要求划分的)的最远边界。

    • 当遍历到的索引 i 等于 idx 时,说明遇到了当前子串的结束边界,此时将当前子串长度(i - last)加入结果列表 list 中,并更新 last 为当前索引 i,准备开始寻找下一个子串。
  4. 返回结果:遍历完成后,返回结果列表 list,其中包含了每个满足条件的子串长度。

复杂度分析:

  • 时间复杂度:O(N),其中N为字符串 S 的长度。代码中包含两次遍历,但总体时间复杂度仍为线性。
  • 空间复杂度:O(1),虽然使用了 edge 数组,但其大小固定为26,与输入字符串长度无关,因此空间复杂度为常数级别。

总结:

该代码段实际实现的是根据字符的最后出现位置,将字符串划分成若干满足特定条件的连续子串,并返回这些子串的长度列表。描述中的回文串划分与实际实现功能不符。

方法二:

class Solution{/*解法二: 上述c++补充思路的Java代码实现*/public  int[][] findPartitions(String s) {List<Integer> temp = new ArrayList<>();int[][] hash = new int[26][2];//26个字母2列 表示该字母对应的区间for (int i = 0; i < s.length(); i++) {//更新字符c对应的位置ichar c = s.charAt(i);if (hash[c - 'a'][0] == 0) hash[c - 'a'][0] = i;hash[c - 'a'][1] = i;//第一个元素区别对待一下hash[s.charAt(0) - 'a'][0] = 0;}List<List<Integer>> h = new LinkedList<>();//组装区间for (int i = 0; i < 26; i++) {//if (hash[i][0] != hash[i][1]) {temp.clear();temp.add(hash[i][0]);temp.add(hash[i][1]);//System.out.println(temp);h.add(new ArrayList<>(temp));// }}// System.out.println(h);// System.out.println(h.size());int[][] res = new int[h.size()][2];for (int i = 0; i < h.size(); i++) {List<Integer> list = h.get(i);res[i][0] =  list.get(0);res[i][1] =  list.get(1);}return res;}public  List<Integer> partitionLabels(String s) {int[][] partitions = findPartitions(s);List<Integer> res = new ArrayList<>();Arrays.sort(partitions, (o1, o2) -> Integer.compare(o1[0], o2[0]));int right = partitions[0][1];int left = 0;for (int i = 0; i < partitions.length; i++) {if (partitions[i][0] > right) {//左边界大于右边界即可纪委一次分割res.add(right - left + 1);left = partitions[i][0];}right = Math.max(right, partitions[i][1]);}//最右端res.add(right - left + 1);return res;}
}

这段Java代码是为了解决一个字符串划分问题的实现,具体是这样的:给定一个字符串s,需要将字符串划分成若干个子串,使得每个子串内的字符种类完全相同。返回每个子串的长度组成的列表。以下是代码的详细解析:

findPartitions 方法

该方法负责找出字符串s中每个字符的所有出现位置,然后将这些位置以区间的形式存储起来。每个字符的区间由该字符首次出现的位置和最后一次出现的位置组成。

  1. 初始化:创建一个大小为26(对应英文字母数量)的二维数组hash,用于存储每个字符的出现区间,每一行对应一个字符,第一列存储起始位置,第二列存储结束位置。
  2. 遍历字符串:通过遍历字符串s,记录每个字符的起始和结束位置到hash数组中。
  3. 组装区间:遍历hash数组,将有效的区间(即字符至少出现过一次的区间)存入一个列表h中。
  4. 转换为数组并返回:最后,将列表h中的数据复制到二维数组res中并返回。

partitionLabels 方法

该方法基于findPartitions方法得到的区间信息,进一步计算每个满足条件的子串长度,并将这些长度组成列表返回。

  1. 调用findPartitions:首先调用findPartitions方法,获取每个字符的区间信息。
  2. 排序:对区间按起始位置进行排序。
  3. 计算子串长度:遍历排序后的区间,根据区间的起始和结束位置计算子串长度。当当前区间的起始位置大于right(记录上一个子串的结束位置)时,说明遇到了新的不重叠子串,将前一个子串的长度加入结果列表res,并更新left为当前区间的起始位置。同时,更新right为当前遍历到的区间的结束位置中的最大值,以检查是否有重叠。
  4. 添加最后一个子串长度:循环结束后,还需将最后一个子串的长度添加到结果列表中。
  5. 返回结果:返回结果列表res

注意事项

  • 代码中注释提到的“上述C++补充思路”在提供的Java代码中并未直接体现,可能是代码注释与实现细节有所出入。
  • findPartitions方法中,对第一个字符的特殊处理(设置起始位置为0)实际上是多余的,因为遍历字符串时已经正确初始化了每个字符的起始位置。
  • 整体而言,代码实现了将字符串根据相同字符分割成子串,并计算每个子串长度的功能,但存在一些冗余和可以优化的地方。

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

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

相关文章

基于WPF技术的换热站智能监控系统16--动态数据绑定

1、实现思路 1&#xff09;实时读取到的数据绑定到前台UI控件上&#xff0c;这个通过MVVM模式实现&#xff0c;同时注意实时读取必须通过任务task异步方式&#xff0c;这就需要读取PLC数据。 2&#xff09;UI控件的动作&#xff0c;如开或关水泵&#xff0c;必定能够将值写入…

Python | Leetcode Python题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution:def majorityElement(self, nums: List[int]) -> int:count 0candidate Nonefor num in nums:if count 0:candidate numcount (1 if num candidate else -1)return candidate

Java | Leetcode Java题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; class Solution {public int titleToNumber(String columnTitle) {int number 0;int multiple 1;for (int i columnTitle.length() - 1; i > 0; i--) {int k columnTitle.charAt(i) - A 1;number k * multiple;multiple * 26;}ret…

《Windows API每日一练》5.2 按键消息

上一节中我们得知&#xff0c;Windows系统的按键消息有很多类型&#xff0c;大部分按键消息都是由Windows系统的默认窗口过程处理的&#xff0c;我们自己只需要处理少数几个按键消息。这一节我们将详细讲述Windows系统的所有按键消息及其处理方式。 本节必须掌握的知识点&…

wsl2平台鸿蒙全仓docker编译环境快速创建方法

文章目录 1 文章适用范围&#xff1a;2 WSL环境安装3 镜像迁移非C盘4 Docker环境准备4.1 docker用户组和用户创建4.2 Docker环境配置4.2.1 Ubuntu下安装docker工具4.2.2 鸿蒙Docker环境安装4.2.3 鸿蒙全仓代码拉取编译 5 鸿蒙全仓代码的更新策略6 参考文献7 FAQ7.1 缺头文件xcr…

每天写java到期末考试(6.21)--集合4--练习--6.20

练习1&#xff1a; 正常写集合 bool类 代码&#xff1a; import QM_Fx.Student;import java.util.ArrayList;public class test {public static void main(String[] args) {ArrayList<Student> listnew ArrayList<>();//2.创建学生对象Student s1new Student(&quo…

【面试干货】throw 和 throws 的区别

【面试干货】throw 和 throws 的区别 1、throw1.1 示例 2、throws2.1 示例 3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;throw和throws都与异常处理紧密相关&#xff0c;但它们在使用和含义上有明显的区别。…

【Linux】关于在华为云中开放了端口后仍然无法访问的问题

已在安全组中添加规则: 通过指令: netstat -nltp | head -2 && netstat -nltp | grep 8080 运行结果: 可以看到服务器确实处于监听状态了. 通过指令 telnet 公网ip port 也提示: "正在连接xxx.xx.xx.xxx...无法打开到主机的连接。 在端口 8080: 连接失败"…

[C++][数据结构][B-树][上]详细讲解

目录 0.常见的搜索结构1.B树概念2.B-树的插入分析1.流程分析2.插入过程总结 0.常见的搜索结构 种类数据格式时间复杂度顺序查找无要求 O ( N ) O(N) O(N)二分查找有序 O ( l o g 2 N ) O(log_2 N) O(log2​N)二叉搜索树无要求 O ( N ) O(N) O(N)二叉平衡树无要求 O ( l o g 2 …

Nvidia Isaac Sim搭建仿真环境 入门教程 2024(4)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

怎么添加网页到桌面快捷方式?

推荐用过最棒的学习网站&#xff01;https://offernow.cn 添加网页到桌面快捷方式&#xff1f; 很简单&#xff0c;仅需要两步&#xff0c;接下来以chrome浏览器为例。 第一步 在想要保存的网页右上角点击设置。 第二步 保存并分享-创建快捷方式&#xff0c;保存到桌面即可…

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中&#xff0c;AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理&#xff0c;难免会造成资源确实或导致冗余&#xff0c;因此对于AB包的打包流程来说&#xff0c;进行策略管理显得十分重要。…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] API集群访问频次统计(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

IOS逆向分析—终极详细(三)

IOS逆向分析—终极详细&#xff08;三&#xff09; 前言一、逆向分析是什么&#xff1f;二、IDA分析1.下载并安装IDA2.安装插件3.加载二进制4.代码分析5.其它 总结 前言 本文是个人完成对IOS上APP分析的整个过程&#xff0c;当然对于不同的机型还会遇到不同的情况&#xff0c;谨…

RabbitMQ 开发指南

连接RabbitMQ 连接方式一&#xff1a; 也可以选择使用URI的方式来实现 连接方式二&#xff1a; Connection接口被用来创建一个Channel&#xff0c;在创建之后&#xff0c;Channel可以用来发送或者接收消息。 Channel channel conn.createChannel();使用交换器和队列 声明…

android在线阅读代码网站

android在线阅读代码社区&#xff1a; Android 1.6 到 Android 10 的源码&#xff1a; Android OS 在线源代码 - https://www.androidos.net.cn10.0.0_r6 - Android社区 - https://www.androidos.net.cn/ AndroidXRef https://cs.android.com/ https://cs.android.com/android…

《梦醒蝶飞:释放Excel函数与公式的力量》4.1if函数

第4章&#xff1a;逻辑与条件函数 第一节4.1 if函数 在Excel中&#xff0c;逻辑函数用于处理基于特定条件的真假判断&#xff0c;它们是构建复杂公式和进行高级数据分析的基础。本章将深入探讨逻辑函数的使用方法&#xff0c;特别是IF函数&#xff0c;这是Excel中最为常用的条…

win10免安装配置MySQL8.4.0

注&#xff1a;此教程基于win10 22H2 版本 1、下载最新版本MySQL压缩包 下载链接&#xff1a;MySQL官网下载地址 点击第二行的 ZIP Archive 后面的Download&#xff08;当前时间2024-06-19最新版本是8.4.0&#xff09; 2、解压并添加配置文件 下载完毕后&#xff0c;解压缩…

修复 pprof ---node_exproter访问漏洞(go-pprof-leak)

前言&#xff1a; ** 在Go语言中&#xff0c;pprof和debug包是用来检测和避免goroutine泄漏&#xff0c;避免导致goroutine泄漏&#xff0c;进而消耗大量系统资源。不过对于安全而言确又存在一定风险&#xff0c;** 风险&#xff1a; 通过node_exporter web发现 190.168.46.1…

数据结构之“算法的时间复杂度和空间复杂度”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、算法效率 1.1算法的复杂度概念 1.2复杂度的重要性 二、时间复杂度 2.1时间复杂度的概念 2.2大O的渐进表示法 2.3常见的时间复杂度…